[TOC]

0x00 快速入门

命令提示符格式:

1
2
3
4
5
6
7
8
9
//示例:
[[email protected] ~]#

//说明:
root: 当前登录用户 root是Linux中管理员用户
localhost:主机名
~ 当前所在目录(家目录)
# 超级用户的提示符
$ 普通用户的提示符是

命令与文件补全:在Bash(sh)中命令与文件补全是非常方便与常用的功能我们只要在输入命令或文件时,按Tab键就会自动进行补全
Linux命令书写规范:一条完整的linux基本由两部分组成,命令和参数,命令和参数之间用空格隔开,并用”-“或者”–“连接


文件与目录的类型/权限:

1
2
3
4
5
6
7
8
9
10
11
12
13
#文件与目录的类型
drwxr-xr-x :d 代表目录
-rwxr-xr-x :- 代表文件
lrwxrwxrwx :l 软链接文件
crw-rw---- :c 字符设备
brw-rw---- :b 块设备
srw-rw-rw-:

#权限
drwxr-xr-x. #权限10位
#r表示read,w表示write,x表示execute,-表示无权限
rw- r—x r—x #没三位一组
rw- 代表所有者 r--代表所属组 r--代表其他人


dir 命令

用法与参数:

1
2
3
4
5
6
$dir [选项][文件或目录] #文件查看 与 ls差不多
-a 显示所有文件,包括隐藏文件
-l 显示详细信息
-d 查看目录属性
-h 人性化显示文件大小
-i 显示inode

示例:

1
2
3
4
5
#示例1:显示所有的文件并人性化显示大小与inode
[[email protected] ~]$dir -lhi
total 5.6M
139002 -rwxr-xr-x 1 root root 994 May 13 22:40 dingding.py
139000 -rw-r--r-- 1 root root 5.6M May 6 2018 dingding.sh


ls 命令 - 查看文件和目录

描述:显示目录和文件list dirctory

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
ls [选项][文件或目录]
#[选项]
-a, --all 同时显示出以.开头的内容,包括.目录(当前目录)和..目录(父目录).
-A, --almost-all 同时显示出以.开头的内容,不包括.目录和..目录.
--author 在使用-l参数时同时显示出文件创建者.
-B, --ignore-backups 不显示以~结尾的文件(备份文件).
-c, (默认)按最近修改时间来排列显示条目,新的在前面.-lt按最近修改时间排列条目,并显示修改时间.-l显示修改时间,但按字母顺序排列.
-C ,列列的列出条目.
--color[=WHEN] 设置是否用颜色区分条目类别,WHEN可以为never,always和auto.never和always都很明了,auto是指标准输出和terminal绑定时才显示颜色.颜色由环境变量LS_COLORS决定.
-d, --directory 之列出目录条目,且不列出快捷方式.
-f 不排序列出,启用-aU,同时禁用-ls和--color.
-g 类似-l,但不显示除所有者.
-G, --no-group 在-l中不列出组名.
-h, --human-readable 在-l中以更易理解的方式列出文件大小. (e.g., 1K 20M)
--si 同上,但倍数是1000而不是1024
-i, --inode 显示出每个条目的index number.
-I(i的大写), --ignore=PATTERN 不列出符合shell样式的条目.(不显示排除的文件)
--hide=PATTERN 但是会被-a或-A覆盖.
-l 以详细列表的模式展示信息.
-m 所有项目用逗号分隔显示.
-n, --numeric-uid-gid 类似-l,同时列出用户和分组信息.
-o 类似-l,但不列出组信息.
-p, --indicator-style=slash 在目录后面加上/
-r, --reverse 反向排序显示.
-R, --recursive 列出所有子目录.
-s, --size 显示出每个文件被分配的空间.
-S 按大小来排序文件.
--sort=WORD 根据WORD来排序,可以为none,extension,size,time和version.
--time=WORD 在-l里,根据WORD来替代修改时间,可以为atime,access,use,ctime,status.
-t 根据修改时间排序,新的在前面.
-U 不排序,根据系统原有顺序排列.
-v 根据版本号排列.
-x 按行的顺序排列.
-X 根据扩展名排序.
-1 一行只显示一个项目.
--full-time : 以完整时间模式进行输入
--time={atime,ctime} : 输出访问时间或改变权限属性时间(ctime)而非内容更改的时间(mtime)
--color={never,always,auto} : 绝不/显示颜色/自行决定

#返回值
0 正常.
1 小问题(e.g., 不能进入子目录).
2 严重问题(e.g., 不能进入命令行参数显示的目录).

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#0. 不显示. 与 .. 目录
$ls -A

#1.排除显示除dingding.sh之外得文件与目录
$ls -I dingding.sh
dingding.py quartz_uninstall.sh startWechat.sh uninstall.sh
$ls -I *.yml #不加单双引号将匹配显示同配置
handlers.yml listen.yml notify.yml tag.yml test.yml version.yml
$ls -I "*.yml" #即反向匹配显示
10.10.107.222.txt listen.yml.save notify.yml.save test.txt
$ls -I "*5" -I "*0" |xargs rm # 将要删除的文件作为参数通过xargs传给rm命令


#2.人性化显示所有文件以及文件inode
$ls -ialh
131087 -rw------- 1 root root 16K May 31 12:32 .bash_history

#3.列出文件的PID
$ls -n
total 5692
-rwxr-xr-x 1 0 0 994 May 13 22:40 dingding.py

#4.按照扩展名显示文件
$ls -Xl
drwxr-xr-x 2 root root 4096 Mar 1 10:35 pythonDemo
drwxr-xr-x 2 root root 4096 May 31 14:44 www
-rwxr-xr-x 1 root root 994 May 13 22:40 dingding.py
-rw-r--r-- 1 root root 5803476 May 6 2018 dingding.sh

#5.排序
ls -1h --sort=size #按照大小排序
ls -lhs
ll -Sh
ls -1h --sort=time #按照时间排序
ls -lht
ls -laht
ls -lht -r #按照时间反向排序

#6.不显示所有者/组和把权限转换成数字(uid/guid号)
$ls -lG
$ls -ln

#7.显示文件和目录得安全性上下文(Selinux)
ls -alhZd /root/ #ll -Zd .
dr-xr-x---. root root system_u:object_r:admin_home_t:s0 /root/

#8.显示完整的文件的修改时间
$ls -alh --full-time /etc/group
-rw-r--r-- 1 root root 735 2020-05-09 17:10:25.795053900 +0800 /etc/group

# 9.查看修改时间/访问时间/状态修改时间
❯ ls -al core-js-banners; ls -al --time=atime core-js-banners; ls -al --time=ctime core-js-banners
-rw-r--r-- 1 root root 1 Oct 18 12:55 core-js-banners # 修改时间
-rw-r--r-- 1 root root 1 Oct 10 09:48 core-js-banners # 访问时间
-rw-r--r-- 1 root root 1 Oct 18 12:55 core-js-banners # 权限属性时间

WeiyiGeek.ls

WeiyiGeek.ls

补充说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#为例来说明:
-rw-r--r--[10个字符] 1[硬连接] root root 5803476 May 6 2018 dingding.sh

# 第一列为文件种类及权限:其中第一个字符表示文件的种类
即,-表示是普通文件,d表示为目录,c表示为字符设备,b表示为块设备,来表示连接文件
后面的九位:每3个字符为一块表示了此文件(目录)的属主、属组及others的权限
其中 r表示read,w表示write,x表示execute,-表示无权限


#2.第二列表示硬链接个数:
文件每增加一个硬链接,数字会增加1,默认从1开始
1表示无硬链接文件,
2表示他是目录,注意目录是不能做硬链接

#3.第三列为文件(目录)的属主(user)
#4.第四列为文件(目录)的属组(group)
#5.第五列为文件(目录)的大小,单为为字节(size)
#6.第六列为文件(目录)创建时间或最后一次访问时间
顺序为月、日、时间,如果该时间离现在过久则直接显示年份

注意:对目录如果没有w权限,即使里面的文件有写权限,也不能对文件进行移动,重命名操作,此时需要给目录加上w权限


cd 命令 - 目录切换

描述:切换目录命令(change Directory)

常用命令:

1
2
3
4
5
6
7
8
9
# 常规
cd /目录

# 五种特殊的目录
cd ~ 或者 cd /root/ 回到家目录
cd ~weiyigeek 直接到weiyigeek的家目录
cd - 回到上次所在目录
cd .. 回到上一级目录
cd . 进入当前目录

基础示例:

1
2
3
❯ useradd -m weiyi
cd ~weiyi
/home/weiyi

Tips:快捷键说明 ctrl+L 清屏,按两下tab键目录/命令补全;


pwd 命令 - 显示当前目录

描述:获取当前目录位置即Print Working Directory;

基础语法与重要参数:

1
2
3
4
pwd [-P]

# 参数
-P :显示出当前路径而非使用连接(Link)路径

实际示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 1.获取当前目录位置
[[email protected] home]$pwd
/home

# 2.-P参数异同显示实际的工作目录而非链接存在的目录
❯ ls -ld /var/lock
lrwxrwxrwx 1 root root 9 Apr 23 14:40 /var/lock -> /run/lock
cd /var/lock
pwd
/var/loc # 对比点

pwd -P
/run/lock # 对比点

Tips: 两种路径表示;

1
2
绝对路径: /root/directory
相对路径: ~/directory


mkdir 命令 - 新建立目录

描述:创建目录命令(Make Directory)

基础语法与重要参数:

1
2
3
4
5
6
mkdir -vp 目录名 

# 参数
-p 用来递归创建
-m 配置创建目录时候的权限而不需要看默认权限(umask)
-v 显示建立过程

简单示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#示例1.递归建立多个目录
mkdir -vp /tmp/{oa,bbs,video} #采用数组建立个目录
mkdir: created directory ‘/tmp/oa’
mkdir: created directory ‘/tmp/bbs’
mkdir: created directory ‘/tmp/video’


#示例2.建立父目录然后再每个父目录中建立子目录
mkdir -vp /tmp/{a,b,c}/{test1,test2}
# mkdir: created directory '/tmp/a'
# mkdir: created directory '/tmp/a/test1'
# mkdir: created directory '/tmp/a/test2'
# mkdir: created directory '/tmp/b'
# mkdir: created directory '/tmp/b/test1'
# mkdir: created directory '/tmp/b/test2'
# mkdir: created directory '/tmp/c'
# mkdir: created directory '/tmp/c/test1'
# mkdir: created directory '/tmp/c/test2'

#示例3.创建目录师权限指定
❯ mkdir -m 711 weiyigeek # 新建权限伟rwx--x--x的目录
❯ ls -ld /tmp/weiyigeek
drwx--x--x 1 root root 4096 Oct 18 12:31 /tmp/weiyigeek


rm 命令

描述:删除空目录(Remove Empty Directory),删除非空目录或文件;
TIPS: 慎用 rm -rf / 会删掉根目录下的所有文件;

1
2
3
4
5
6
7
8
#基础语法
rmdir【目录名】
rm [选项]【目录/文件】

#rm 参数
-i 删除前进行交互式提示
-r 递归删除文件夹,包括空文件夹
-f 强制无条件删除只读文件

示例:

1
2
3
4
5
6
7
8
9
10
#示例1.
rm -rf / : 强制无条件删除root目录下所有内容。
rm -rf * : 强制无条件删除当前目录下所有内容。
rm -rf . : 强制无条件删除当前文件夹和子文件夹

#示例2.删除排除文件以外的文件或者目录
rm `ls -I demo.config`

#示例3.在rm命令前加上反斜杠可以忽略掉alias的指定参数则的删除此目录而不需要询问;
\rm -r /tmp/demo.txt


rmdir 命令 - 删除一个空目录

描述: 删除空目录(empty directory)并且该目录中不能存在其他的目录或者文件。

语法参数:

1
-p : 连同上级目录一起删除

1
2
#示例0:递归删除所有空目录
rmdir -p *


cp 命令 - 文件目录复制

描述:拷贝文件和目录是每一个操作系统的基本指令。备份行为基本上是创建文件和目录的副本。在Linux系统下我们可以用cp命令来实现,但在进行复制的时候需要关注以下几点:

  • 1.是否需要完整保留来源文件的信息。
  • 2.源文件是否为软连接文件(symbolic link file)
  • 3.源文件是否为特殊文件例如FIFO / socket等
  • 4.源文件是否为目录

语法参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
cp 【选项】【原文件/目录】【目标目录】
cp [-adfilprsu] source1 source2 destination

#参数:
-a 相当于-pdr选项保证和原文件属性一模一样(会保留原文件或目录的属性),但是inode号是变化的
-r 递归持续复制(目录/子目录/文件等)
-p 连带文件属性复制
-u 差异复制(只会复制新增或者已经变化的文件,相同属性并存在的文件不会再从新复制),常用在备份里面
-f 若目的地已经有相同档名的档案存在,则在复制前先予以删除再行复制
-i 若目标文件已经存在在覆盖时会先询问操作的进行(常用)。
-l 创建快捷方式来链接到文件(注意硬链接不能用来创建目录,并且拥有相同得inode号)
-d 若原文件是链接文件,则复制链接属性(不包括属性)
-s 复制成为链接符号文件(symbolic link) 即快捷方式文件( 软链接)
-u 若dest比source旧才更新destination
-P 只拷贝符号链接文件(不随符号链接拷贝原文件)
-L 随符号链接拷贝原文件(与上面的 -P 选项 相反)
-v 显示文件拷贝过程
--backup 每一个现有的目标文件做一个备份,可选参数如下。
# none, off:从不备份(即使给出 --backup)
# numbered, t:用编号备份
# existing, nil :如果编号备份存在则使用编号备份,否者用简易备份[译注:也就是用波浪号]
# simple, never :总是使用简易备份
--attributes-only 只会拷贝文件名及其属性,不会拷贝任何数据
--remove-destination 如果 cp 命令在目标目录下发现同名文件, cp 命令会先删除目标文件,然后再拷贝一份新的。

基础示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#示例1.基础示例使用,将一个文件或者目录从一个位置到另一个位置
cp -a weiyi /Users/WeiyiGeek/Documents # 复制weiyi目录到文稿目录下(与上面效果一样带有属性)
cp -rpd weiyi/ /Users/WeiyiGeek/Documents # 复制weiyi目录下的目录到文稿目录下
cp -r directory_1 /home/pungki/office # -r或-R 选项表明递归操作(注意的一件事你需要移除在目录名尾部的斜杠,否则你会收到类似的错误信息cp: omitting directory‘directory_1/’)

#示例2.复制的id号是变化的但属性一致
$cp -a 1.txt 2.txt && ls -i
393342 -rw-r--r-- 1 root root 0 May 31 15:31 1.txt
393343 -rw-r--r-- 1 root root 0 May 31 15:31 2.txt

#示例3.简化cp直接将复制为指定后缀的文件
$cp 1.txt{,.bak} && ls
1.txt 1.txt.bak

#示例4.强制覆盖不提示重写
$cp -fn 1.txt demo/1.txt

#示例5.交互模式下会询问是否覆盖目标目录下的文件。使用 -i 选项启用交互模式。
cp -ir directory_1/ /home/pungki/office/
$yes | cp /etc/fstab /etc/fstab_bak # cp:是否覆盖"/etc/fstab_bak"?
$yes | cp -i /etc/fstab /etc/fstab_bak # cp:是否覆盖"/etc/fstab_bak"?

#示例6.若~/.bashrc 比 /tmp/bashrc 新才将其复制过来覆盖/tmp/bashrc
cp -u ~/.bashrc /tmp/bashrc

#示例7.-d 参数的差异对比bashrc_link -> bashrc以及创建文件的硬链接而不是拷贝它们
cp bashrc_link bashrc_link_1 # 复制链接文件的实际文件(按照原文件属性进行拷贝)
cp -d bashrc_link bashrc_link_2 # 复制链接文件
cp -l file_4.txt /home/pungki/office # 创建“快捷方式”或者链接到文件而不是拷贝它们(拥有与原目录文件相同得inode值)
cp -s /home/pungki/office file_4.txt # 创建符号链接只能在当前目录下进行(不通得inode值)
cp -P file_6.txt ./movie # 对符号链接使用 cp 命令它会照原样拷贝它自身
cp -L file_6.txt ./movie # 随符号链接拷贝原文件
cp -v *.txt /home/pungki/office # 显示拷贝作业过程


#示例8.将主文件夹.bashrc及,bash_history 复制到/tmp下(同时拷贝多个文件需要将多个文件用空格隔开)
cp ~/.bashrc ~/.bash_history /tmp

#示例9.当原文件较目标文件新时拷贝
$ cp -vu *.txt /home/pungki/office

#示例10.当目标目录已经含有同名文件,默认情况下 cp 命令会覆盖目标目录下的同名文件使用 --backup 选项,cp 命令会为每一个现有的目标文件做一个备份。../office 相对于 /home/pungki/office 。
$ cp --backup=simple -v *.txt ../office # --backup=simple 选项会创建一个在文件名末尾用波浪符标记(~)的备份文件

#示例11.只拷贝文件属性而不会拷贝文件数据
$ cp --attributes-only file_6.txt -v ../office

#示例12.用了 -f 选项会强制进行拷贝操作。如果目标文件不能打开,可以用 -f 尝试一下。
$ cp -f *.txt -v ../office

#示例13.在拷贝之前先删除目标(如果 cp 命令在目标目录下发现同名文件cp 命令会先删除目标文件然后再拷贝一份新的)
cp --remove-destination *.txt -v ../office


Tips: 我们平常在Linux中使用 cp 命令时会发现将一个目录中文件复制到另一个目录具有相同文件名称时,即使添加了 -rf 参数强制覆盖复制时,系统仍然会提示让你一个个的手工输入 y 确认复制,令人不胜其烦那么这是由于什么原因引起的?

  • 原因 : alias 命令中存在cp命令的别名导致的
    1
    2
    # 注:我们平时使用 cp 命令虽然没有添加任何参数 ,但系统默认会在我们使用 cp 命令时自动添加 -i 参数(即交互的缩写方式)
    alias cp='cp -i'
  • 解决方案:去掉 cp 命令的别名此时使用 cp -rf 复制文件时,就不会要求确认啦.
    1
    unalias cp


mv 命令

描述:剪切或改名命令(move)

1
2
3
4
5
6
7
8
mv 【原文件或目录】【目标目录】  #在同一目录下就是改名
mv 指定的文件夹/文件 /dev/null

# 参数
-f:强制移动,不会出现警告信息
-i:互动模式,移动之前询问你
-u:目标存在的时候,只有source比较新才会更新
-t: --target-directory=DIRECTORY #将所有源参数移动到目录中

基础实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#示例1:在linux下/dev/null或null是一种特殊的文件,它们会把写入自身的数据全部丢弃,再返回操作成功的消息。
mv 1.txt /dev/null #这个mv命令会把指定的文件夹移动到/dev/null。
mv /home/user/* /dev/null #上面的命令会把/home/user/下面所有的内容,全部移动到/dev/null这。

#示例2:简单haul语法(备份常用)
$mv pam_unix.so{,.bak} #直接变成pam_unix.so.bak

#示例3.将源目录中批量移动到指定目录中
tmp$ ls www/
# 10.txt 1.txt {1..txt} 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt
tmp$ mv -t backup/ www/*
tmp$ ls backup/
10.txt 1.txt {1..txt} 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt

#示例4.如果有多个源文件或者目录则最后一个目标文件一定是目录
mv bashrc1 bashrc2 mvtest2


touch 命令 - 修改文件实际或者创建新的文件

描述:touch命令不常用,一般在使用make的时候可能会用来修改文件时间戳或者新建一个不存在的文件;

其三个主要的变动时间:

  • 1.modification time : 即mtime当文件内容数据发生改变时候将会被更新; 注意此处指的是文件的内容而不是文件的属性权限;
  • 2.status time : 即ctime当文件的状态发生改变时候将会被更新; 比如权限和属性被更改;
  • 3.access time : 即atime当文件的内容被读取时候将会被更新; 比如使用cat读取/etc/man.config便会更新;
    1
    2
    3
    4
    5
    6
    7
    8
    ❯ ls -lh /etc/manpath.config
    -rw-r--r-- 1 root root 5.1K Feb 26 2020 /etc/manpath.config # mtime

    ❯ ls -lh --time=atime /etc/manpath.config
    -rw-r--r-- 1 root root 5.1K Apr 23 14:41 /etc/manpath.config # atime

    ❯ ls -lh --time=ctime /etc/manpath.config
    -rw-r--r-- 1 root root 5.1K May 9 16:29 /etc/manpath.config # ctime

语法参数:

1
2
3
4
5
6
7
8
9
10
用法:touch [选项] 文件 

# 参数
-a 或--time=atime或--time=access或--time=use  只更改存取时间。
-c 或--no-create  不建立任何文档。
-d 使用指定的日期时间,而非现在的时间。
-f 此参数将忽略不予处理,仅负责解决BSD版本touch指令的兼容性问题。
-m 或--time=mtime或--time=modify  只更改变动时间。
-r 把指定文档或目录的日期时间,统统设成和参考文档或目录的日期时间相同。
-t 使用指定的日期时间,而非现在的时间 use [[CC]YY]MMDDhhmm[.ss]

实际案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 示例1.建立文件与指定时间修改文件
$touch create.txt
$touch -t 201908031122 1.txt
$ls -lh
-rw-r--r-- 1 root root 0 Aug 3 2019 1.txt
-rw-r--r-- 1 root root 0 May 31 15:48 create.txt

# 示例2.采用{}符号批量创建文件
touch hyml-{1..10}.html

# 示例3.时间调整将某个文件的认证修改为目前日期(mtime和atime)
echo > hello.txt
❯ touch -d '2 day ago' hello.txt
❯ ls -alh hello.txt
-rw-r--r-- 1 root root 1 Oct 16 17:37 hello.txt
❯ ls -ailh hello.txt; ls -alhi --time=atime hello.txt;ls -ailh --time=ctime hello.txt
13229323905543610 -rw-r--r-- 1 root root 1 Oct 16 17:37 hello.txt # 修改
13229323905543610 -rw-r--r-- 1 root root 1 Oct 16 17:37 hello.txt # 访问
13229323905543610 -rw-r--r-- 1 root root 1 Oct 18 17:37 hello.txt # 权限属性变更


file 命令 - 查看文件类型

描述: 通过该命令知道某个文件的基本数据是属于ASCII或者是data文件或者是Binary且其中使用到动态函数连接库等等信息;

基础实例:

1
2
3
4
5
6
7
8
9
# ASCII 类型
> ls -alh /tmp/weiyigeek.txt
-rwx--x--t 1 weiyigeek weiyigeek 9 10月 20 05:52 weiyigeek.txt
> file /tmp/weiyigeek.txt
weiyigeek.txt: sticky , ASCII text

# 二进制程序 类型
> file /usr/bin/passwd
/usr/bin/passwd: setuid ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=fa23c6b4e145d9bb5487c6cb7adb9338c5ef4fb9, for GNU/Linux 3.2.0, stripped


ln 命令

描述:链接命令(Link)

1
2
3
4
5
6
7
8
9
10
11
ln -s 【原文件】【path/file】  #功能是生成软链接文件|必使用绝对路径
-s 创建软链接(不加该参数为)

#示例1. 软连接(必使用绝对路径)
ln -s /root/.ssh/id_rsa.pub /tmp/id_rsa.pub

#示例2. 硬连接
$ln /root/.ssh/id_rsa.pub /tmp/id_rsa.pub
$ln create.txt create.txt.bak
393422 -rw-r--r-- 2 root root 0 May 31 15:48 create.txt
393422 -rw-r--r-- 2 root root 0 May 31 15:48 create.txt.bak

WeiyiGeek.ln命令实例

WeiyiGeek.ln命令实例

补充知识:
软链接的特征:

  • 类似于win下的快捷方式,修改任意一个文件另一个都改变(修改的是同一个inode的文件)
  • 软链接拥有自己的i节点和block块,但数据块中只保存原文件的文件名和i节点号,并没有实际的文件数据
  • lrwxrwxrwx l软链接注意软链接文件的权限都是rwxrwxrwx
  • 删除原文件后软链接不能使用
  • 必须使用绝对路径

硬链接的特征:

  1. 硬链接拥有相同的i节点和存储block块可看做是同一个文件
  2. 可通过i节点识别 ls -i (相同的i节点)
  3. 不能跨分区且不能针对目录使用
  4. 删除一个宁外一个也可以打开


rename 命令

描述:该命令可以通过通配符将目录中的所有文件进行批量更改名称;

语法参数:

1
2
3
4
5
6
7
Usage: rename [ -h|-m|-V ] [ -v ] [ -n ] [ -f ] [ -e|-E *perlexpr*]*|*perlexpr*
[ *files* ]

#参数:
-v 表示会显示修改成功的文件名;
-n 则表示不执行任何操作主要用来测试rename过程,并不直接运行,可以查看测试效果后然后再运行
-f 则表示会强制修改。

基础示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#文件示例1:
for i in {1..20};do
touch "demo_"${i}".sh"
done


#更改文件前缀 demo -> weiyigeek
rename -v 's/_/ /g' *
demo_10.sh renamed as demo 10.sh
#Centos7可以
rename -n "demo" "weiyigeek" *.sh #主要匹配sh文件


#测试更改
rename -n 's/demo /weiyigeek-/g' *.sh #注意这里的通配符
# rename(demo 10.sh, weiyigeek-10.sh)
# rename(demo 11.sh, weiyigeek-11.sh)
# rename(demo 12.sh, weiyigeek-12.sh)
# rename(demo 13.sh, weiyigeek-13.sh)

#将文件名称的大写全部转换为小写则为
rename -n 'y/A-Z/a-z/' *
# rename(demo 10.sh, DEMO 10.SH)
# rename(demo10.sh, DEMO10.SH)
# rename(demo 11.sh, DEMO 11.SH)


tempfile命令-Debian

描述:该命令基于Debian发行版中默认自带比如Ubuntu其他发行版没有这个命令;
临时文件的命名方法与随机数,有时候在写Shell脚本的时候需要一些临时存储数据的才做,最适合存储临时文件数据的位置就是/tmp,因为该目录中所有的内容在系统重启后就会被清空。

1
2
3
4
5
6
7
8
tempfile 命令
$RANDOM 是一个返回随机数的环境变量

#方式1.用tempfile命令为一个临时文件命名:
temp_file_name=$(tempfile)

#方式2.用一个加带了随机数的文件名作为临时文件命名:
temp_file_name="/tmp/file_$RANDOM"
WeiyiGeek.tempfile

WeiyiGeek.tempfile



如果没有tempfile命令的Linux发行版,也可以使用自己的临时文件名:

1
2
3
4
5
6
7
8
9
10
#$$是系统预定义变量,显示当前所在进程的进程号,用.$$作为添加的后缀会被扩展成当前运行脚本的进程id。
temp_file_name="/tmp/file.$$"

#示例1:
$echo $temp_file_name
/tmp/file.7526 #当前pid进程号

#示例2:
$touch file_$$ && ls
create.txt create.txt.bak file_7526