命令指南
3种类型的时间戳
GUN/Linux的文件包含3种类型的时间戳
Access: 2020-01-02 20:05:17.117999915 +0800 # 文件最后被访问的时间
Modify: 2020-01-02 20:05:17.117999915 +0800 # 文件最后被修改的时间
Change: 2020-01-02 20:05:17.117999915 +0800 # 文件状态最后被改变的时间
对应ls命令,查看上述时间戳的选项如下
mtime:最后修改时间(ls -lt) # 修改文件内容,文件的修改时间(modify time)会改变
ctime:状态改变时间(ls -lc) # 修改文件内容、移动文件或改变文件属性等,文件的change时间会改变
atime:最后访问时间(ls -lu) # 查看文件内容时,文件的访问时间(access time)会改变
Linux文件及目录管理命令基础
shutdown
| 参数选项 |
解释说明 |
| -r |
重启系统,而不是关机,这个参数在系统重启时经常使用,例如,shutdown -r now |
| -h |
关机,这个参数在系统关机时经常使用,例如,shutdown -h now |
| -H |
关机(halt),使用这个参数对系统进行关机后,系统其实并未完全关机,不常用 |
| -P |
关机(poweroff),不常用 |
| -c |
取消正在执行的shudown指令,不常用 |
| -k |
只发送关机警告并拒绝新用户登录,极不常用 |
实例
| shutdown -h +1 |
1分钟后关闭linux系统 |
| shutdown -r 11:00 |
11点整重启linux系统 |
| shutdown -h now |
立即关闭Linux系统 |
常见的关机、重启、注销命令集合
| 命令 |
说明 |
| 关机命令 |
|
| shutdown -h now |
立刻关机(生产常用) |
| shutdown -h +1 |
1分钟以后关机,1可以是别的数字或时间点,例如,11:00 |
| halt |
立即停止系统,需要人工关闭电源,Centos7下为systemctl halt |
| init 0 |
切换到运行级别0,0表示关机,因此此命令的作用就是关机 |
| poweroff |
立即停止系统,并且关闭电源,Centos7下为systemctl poweroff |
| 重启命令 |
|
| reboot |
立即重启(生产常用),Centos7下为systemctl reboot |
| shutdown -r now |
立即重启(生产常用) |
| shutdown -r +1 |
1分钟后重启 |
| init 6 |
切换到运行级别6,6表示重启,因此此命令的作用就是重启 |
| 注销命令 |
|
| logout |
注销退出当前用户窗口 |
| exit |
注销退出当前用户窗口,快捷键Ctrl+d |
PS1变量
| PS1变量 |
含义 |
| \d |
代表日期,格式为weekday month date,例如,"Mon Aug 1" |
| \H |
完整的主机名称 |
| \h |
仅取主机的第一个名字 |
| \t |
显示时间为24小时格式,例如,HH:MM:SS |
| \T |
显示时间为12小时格式 |
| \A |
显示时间为24小时格式,例如,HH:MM |
| \u |
当前用户的账号名称 |
| \v |
BASH的版本信息 |
| \w |
显示完整的路径,其中家目录会以'~'代替 |
| \W |
利用basename获取工作目录名称,只会列出最后一个目录 |
\# |
执行的第几个命令 |
\$ |
提示字符,如果是root,则提示符为#,普通用户为$ |
如需要让PS1变量永久生效,编辑/etc/bashrc文件,定位到36行,将内容中的大写的W改为小写的w,即可让变量永久生效.执行 source /etc/bashrc使得修改信息生效
PWD *****:显示当前所在位置的信息
| 参数选项 |
解释说明 |
| -L |
logical首字符缩写,表示显示逻辑路径(忽略软连接文件),取PWD系统环境变量的值,此参数不常用 |
| -P |
physical首字符缩写,表示显示物理路径,如果当前目录路径是软连接文件,则会显示软连接对应的源文件 |
| echo $PWD |
PWD系统环境变量 |
cd *****:切换目录
| 参数选项 |
解释说明 |
| -P |
如果切换的目标目录是一个软连接,则会直接切换到软连接指向的真正物理目标目录,与pwd命令的-P选项功能类似,不常用 |
| -L |
功能与-P相反,如果切换的目标目录是一个软连接,则直接切换到软连接所在的目录,与pwd命令的-L选项功能类似,不常用 |
| - |
当前用户的上一次所在的目录路径 |
| ~ |
当前用户的家目录所在的路径 |
| .. |
从当前目录切换到当前目录的上一级所在的路径 |
tree ****:以树形结构显示目录下的内容
| 参数选项 |
解释说明 |
| -a |
显示所有文件,包括隐藏文件(以'.'开头的文件) |
| -d |
只显示目录 |
| -f |
显示每个文件的全路径 |
| -i |
不显示树枝,常与-f参数配合使用 |
| -L level |
遍历目录的最大层数,level为大于的正整数 |
| -F |
在执行文件、目录、Socket、符号链接、管道名称等不同类型文件的结尾,各自加上'*'、'|'、'='、'@'号,类似于ls命令的-F选项 |
mkdir*****:创建目录
| 参数选项 |
解释说明 |
| -p |
①递归创建目录 ②即使要创建的目录事先已存在,也不会报错提示目录存在 |
| -m |
设置新创建目录的默认目录对应的权限 |
| -v |
显示创建目录的过程 |
touch*****:创建文件或更改文件时间戳
| 参数选项 |
解释说明 |
| -a |
只更改指定文件的最后访问时间 |
| -d STRING |
使用字符串STRING代表的事件作为模板设置指定文件的时间属性 |
| -m |
只更改指定文件的最后修改时间 |
| -r file |
将指定文件的时间属性设置为与模板文件file的时间属性相同 |
| -t STAMP |
使用[[CC]YY]MMDDhhmm[.ss]格式的时间设置文件的时间属性.格式的含义从左到右依次为:世纪、年、月、日、时、分、秒 |
ls*****:显示目录下内容及属性信息的命令
| 参数选项 |
解释说明 |
| -l |
使用长格式列出文件及目录信息 |
| -a |
显示目录下的所有文件,包括以'.'字符开始的隐藏文件 |
| -t |
根据最后的修改时间(mtime)进行排序,默认是以文件名进行排序 |
| -r |
依相反顺序排序 |
| -F |
在条目后加上文件类型的指示符号(,/,=,@,|其中的一个)* |
| -p |
只在目录后加上'/' |
| -i |
显示Inode节点信息 |
| -d |
当遇到目录时,列出目录本身而非目录内的文件,并且不跟随符号链接 |
| -h |
以人类可读的信息显示文件或目录的大小,如(1K 234M 2G) |
| -A |
列出所有文件,包括隐藏文件,但不包括'.'与'..'这两个目录 |
| -S |
根据文件大小进行排序 |
| -R |
递归列出所有子目录 |
| -x |
逐行列出项目而不是逐栏列出 |
| -X |
根据扩展名排序 |
| -c |
根据状态改变时间(ctime)排序 |
| -u |
根据最后访问时间(atime)排序 |
| --color={never,always,auto} |
不同的文件类型显示颜色参数,never表示不显示,always表示总是显示,auto表示自动显示 |
| --full-time |
以完整的时间格式输出,等同于ls -l --time-style=full-iso |
| --time-style={full-iso,long-iso,iso,locale} |
以不同的时间格式输出,long-iso效果最好 |
| --time={atime,ctime} |
按不同时间属性输出,atime表示访问时间,ctime表示按改变权限属性时间,如果不加此参数则默认为最后修改时间 |
cp*****:复制文件或目录
| 参数选项 |
解释说明 |
| -p |
复制文件时保持源文件的所有者、权限信息以及时间属性 |
| -d |
如果复制的源文件是符号链接,则仅复制符号链接本身,而且保留符号链接所指向的目标文件或者目录 |
| -r |
递归复制目录,即复制目录下的所有层级的子目录和文件 |
| -a |
等同于上面的p、d、r这3个选项的总和 |
| -i |
在覆盖已有文件前提示用户确认,默认cp带有-i参数
|
| -t |
默认情况下命令格式是'cp 源文件 目标文件',使用-t参数可以颠倒顺序,格式变为'cp -t 目标文件 源文件' |
cp覆盖文件不提示的是否覆盖的几种方法
- which cp --> usr/bin/cp file1.txt file2.txt 使用cp命令的绝对路径屏蔽别名
- \cp file1.txt file2.txt 使用
'\'屏蔽别名
- alias取消别名 unalias cp 系统重启失效
- cat ~/.bashrc 编辑 aliascp='cp -i',重启后生效.'.bashrc'会在开机时加载 不建议使用,只用于开拓思路
快速备份文件案例
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.ori
# 上面的格式中,有一部分路径重复了,使用{}进行快捷输入命令,这两种方法是等效的
cp /etc/ssh/sshd_config{,.ori}
# 这种方法的原理是bash对大括号的展开操作,/etc/ssh/sshd_config{,.ori}展开成/etc/ssh/sshd_config /etc/ssh/sshd_config.ori再传给cp命令
mv*****:移动或重命名文件
| 参数选项 |
解释说明 |
| -f |
若目标文件已经存在,则不会询问而是直接覆盖 |
| -i |
若目标文件已经存在,则会询问是否覆盖 |
| -n |
不覆盖已经存在的文件 |
| -t |
指定mv的目标目录,适用于移动多个源文件到一个目录的情况,此时目标目录在前,源文件在后,与cp命令-t功能一致 |
| -u |
在源文件比目标文件新,或者目标文件不存在时才进行移动 |
- mv dir1/file* ------>"file
*"匹配所有以file开头的文件 将dir1/file**的文件移动到当前所在位置
rm:删除文件或目录
| 参数选项 |
解释说明 |
| -f |
强制删除.忽略不存在的文件,不提示确认 |
| -i |
在删除前需确认 |
| -I |
|
| -r |
递归删除目录及其内容 |
-
补充:慎用rsync --delete
- 多数情况下,删除数据后是可以恢复的(例如,可通过恢复工具ext3grep来实现),但一定会影响业务,例如,造成停机,或者数据丢失了较长时间,用户访问不了等.
Linux文件过滤及内容编辑处理
vi/vim*****:纯文本编辑器
vi是Linux命令行界面下的重要文字编辑器.vim是vi的增强版,例如,高亮显示代码、自动缩进等.vim与vi是兼容的,建议使用vim编辑器代替vi编辑器
用法格式
vim [option] [file]
vim 选项 文件
vim分为三种模式:普通模式、编辑模式、命令模式,作用分别如下:
- 普通模式:用vim命令打开文件后,默认的状态就是普通模式.在这个模式中,不能进行编辑输入操作,但可以按"上下左右"键来移动光标,同时还可以执行一些操作命令进行如删除、赋值、粘贴等工作.
- 编辑模式:在普通模式下不能进行编辑输入模式,只有按下"i,I,o,O,a,A,r,R,s,S"(其中"i"最常用)等字幕进入编辑模式后才可以执行录入文字等编辑操作.确定文件是否处于编辑模式状态有一个重要特征,那就是在窗口的左下角要有插入的标记 "-- INSERT --"或"-- 插入 --"
- 命令模式:在普通模式下,输入":"或"/"或"?"时,光标会自动定位在那一行,在这个模式中可以执行保存、退出、搜索、替换、显示行号等相关操作
image-20200108093711473.png
| 命令 |
说明 |
| 普通模式:移动光标的操作 |
|
| G 或 (shift+g) |
将光标移动到文件的最后一行 |
| gg |
将光标移动到文件的第一行,等价于1gg或1G |
| 0 |
数字0,将光标从所在位置移动到当前行的开头 |
| $ |
从光标所在位置将光标移动到当前行的结尾 |
n<Enter>
|
n为数字,<Enter>为回车键,将光标从当前位置向下移动n行 |
| ngg |
n为数字,移动到文件的第n行,如11gg可移动到第11行,配合":set nu"查看,如同nG |
| H |
光标移动到当前窗口最上方的那一行 |
| M |
光标移动到当前窗口中间的那一行 |
| L |
光标移动到当前窗口最下方的那一行 |
| h 或 (←) |
光标向左移动一个字符 |
| j 或 (↓) |
光标向下移动一个字符 |
| k 或 (↑) |
光标向上移动一个字符 |
| l 或 (→) |
光标向右移动一个字符 |
| 普通模式:搜索与替换操作 |
|
| /old |
从光标位置开始,向下寻找名为old的字符串 |
| ?old |
从光标位置开始,向上寻找名为old的字符串 |
| n |
从光标位置开始,向下重复前一个搜索的动作 |
| N |
从光标位置开始,向上重复前一个搜索的动作 |
| :g/A/s/B/g |
将符合A的内容全部替换为B,斜线为分隔符,可以用@、#等替代 |
| :%s/A/B/g |
将符合A的内容全部替换为B,斜线为分隔符,可以用@、#等替代 |
| :n1,n2s/A/B/g |
n1、n2为数字,在n1行和n2行间寻找A,用B替换 |
| 普通模式:复制、粘贴、删除等操作 |
|
| yy |
复制光标所在的当前行 |
| nyy |
n为数字,复制光标开始向下共n行 |
| p/P |
p将已复制的数据粘贴到光标的下一行,P则为粘贴到光标的上一行 |
| dd |
删除(剪切)光标所在行 |
| ndd |
n为数字,删除(剪切)从光标开始向下共n行 |
| u |
恢复(回滚)前一个执行的操作 |
| . |
重复前一个执行过的动作 |
| x |
向后删除字符 |
| X |
向前删除字符 |
| d1G |
删除当前行至第一行 |
| dG |
删除当前行至最后一行 |
| d0 |
删除当前光标文本至行首 |
| d$ |
删除当前光标文本至行尾 |
| 进入编辑模式命令 |
|
| i |
在当前光标所在处插入文字 |
| a |
在当前光标所在处的下一字符处插入文字 |
| I |
在当前光标所在行的行首的第一个非空格符处插入文字,与A相反 |
| A |
在当前光标所在行的行尾的最后一个字符处插入文字,与I相反 |
| O |
在当前所在行的上一行插入新的一行 |
| o |
在当前所在行的下一行插入新的一行 |
| Esc |
退出编辑模式,回到命令模式 |
| 命令行模式 |
|
| :wq |
退出并保存 |
| :wq! |
退出并强制保存,"!"为强制的意思 |
| :q! |
强制退出,不保存 |
| :n1,n2 w filename |
n1、n2为数字,将n1行到n2行的内容保存成filename这个文件 |
| :n1,n2 co n3 |
n1、n2为数字,将n1行到n2行的内容复制到n3位置下 |
| :n1,n2 m n3 |
n1、n2为数字,将n1行到n2行的内容挪到n3位置下 |
| :!command |
暂时离开vi命令到命令行模式下执行command的结果,例如:! ls /etc |
| :set nu |
显示行号 |
| :set nonu |
与set nu相反,取消行号 |
| :vs filename |
垂直分屏显示,同时显示当前文件与filename对应文件的内容 |
| :sp filename |
水平分屏显示,同时显示当前文件与filename对应文件的内容 |
| I + # + Esc |
在可视化模块下(ctrl + v),一次性注释多行,取消注释可用"n1,n2s/#/ /gc",这里的操作是一个通用的方法,#号可以换成别的操作,例如tab键,这样就成了批量缩进 |
| Del |
在可视化模块下(ctrl + v),一次性删除所选内容 |
| r |
在可视化模块下(ctrl + v),一次性替换所选内容 |
vim打开文件的其他几种方法
| vim file |
打开/新建文件,光标位于第一行行首,file为任意文件名 |
| vim file +n |
打开文件,光标置于第n行行首,n为自然数 |
| vim file : |
打开文件,光标置于最后1行行首 |
| vim file +/pattern |
将光标置于与pattern匹配的第一个字符串处,pattern为任意字符串 |
echo*****:显示输出文本内容
| 参数选项 |
解释说明 |
| -n |
不要自动换行 |
| -E |
不解析转义字符(默认参数) |
| -e |
若字符串中出现以下字符,则需要进行特别处理,而不会将它当成一般文字输出 \a:发出警告声 \b:删除前一个字符 \c:最后不加上换行符 \f:换行但光标仍旧停留在原来的位置 \n:换行且光标移至行首 \r:光标移至行首,但不换行 \t:插入tab |
可以使用;连接两个echo命令
[root@grape tmp]# echo -e "\033[46;31mhello,world \033[0m" 打印彩色输出,范围是[40-47;30-37m
cat*****:合并文件或查看文件内容
concatenate缩写,功能是连接多个文件并且打印到屏幕输出,或者重定向到指定文件中.此命令常用于显示单个文件内容,或者将几个文件内容连接起来一起显示,还可以从标准输入中读取内容并显示,生产环境中,常与重定向或追加符配合使用.
| 序号 |
cat命令常用功能 |
简要例子说明 |
| 1 |
查看文件内容 |
例如:cat file.txt |
| 2 |
把多个文件合并成一个 |
例如:cat file1.txt file2.txt > newfile.txt |
| 3 |
创建编辑新文件 |
例如:输入cat > file1.txt,后面接要编辑的内容,使用快捷键Ctrl + d 或Ctrl + c可结束编辑,了解即可 |
| 4 |
非交互式地编辑或追加内容到文件尾部 |
生产环境最重要的应用,命令格式 1.cat >>file1.txt<<EOF 2.hello,world 3.EOF |
| 5 |
清空文件内容 |
例如:使用cat /dev/null >file1.txt就可以将文件内容清空,但是文件还存在 |
| 参数选项 |
解释说明 |
| -n |
从1开始对所有输出的内容按行编号 |
| -b |
与-n选项功能类似,但忽略显示空白行行号 |
| -s |
当遇到有连续两行以上的空白行,就替换为一行空白行 |
| -E |
在每一行的行尾显示$ |
| T |
将Tab字符显示为"^I" |
| -v |
除了LFD和TAB之外,使用"^"和"M-"引用 |
| -e |
等价于-vE |
| -A |
等价于-vET三个选项的功能之和 |
| -t |
等价于-vT |
重定向符
| 名称 |
文件描述简介 |
| 标准输入(stdin) |
代码为0,配合"<"或"<<"使用 数据流从右向左 |
| 标准输出(stdout) |
代码为1,配合">"或">>"使用 数据流从左向右 |
| 标准错误输出 |
代码为2,配合">"或">>"使用 数据流从左向右 |
|
重定向符号,数据流是箭头方向 |
| 标准输入重定向 |
"0<"或"<" 清空已有内容,数据一般从文件流向处理命令 |
| 标准输入追加重定向 |
"0<<"或"<<" 追加内容到底部,数据一般从文件流向处理命令 |
| 标准输出重定向 |
"1>"或">" 正常输出重定向到文件,会清空已有内容 |
| 标准输出追加重定向 |
"1>>"或">>" 将内容追加重定向到文件底部,不会清空已有内容 |
| 标准错误输出重定向 |
"2>" 将标准错误内容重定向到文件,如果文件存在则清空 |
| 标准错误输出追加重定向 |
"2>>" 将标准错误内容重追加到文件底部,不会清空已有内容 |
echo 123 1>a.txt 2>b.txt
# 此条命令如果执行成功,则a文件会写入123.执行失败b文件会写入错误提示.
more****:分页显示文件内容
| 参数选项 |
解释说明 |
| -num |
指定屏幕大小为num行 |
| +num |
从行号num开始显示 |
| -s |
将连续的多个空行显示为一行 |
| -p |
不滚屏,而是清除整个屏幕,然后显示文本 |
| -c |
不滚屏,而是从每一屏的顶部开始显示文本,每显示完一行,就清除这一行的剩余部分 |
| 子命令 |
解释说明 |
| h 或 ? |
查看帮助 |
| 空格键 |
向下滚动一屏 |
| z |
向下滚动一屏,与空格键功能相同 |
| Enter |
向下显示1行 |
| f |
向下滚动一屏,2倍的空格键 |
| b |
返回上一屏 |
| = |
输出当前行的行号 |
| / |
查找指定文本 |
| :f |
输出文件名和当前行的行号 |
| v |
调用vi编辑器 |
| !命令 |
调用shell,并执行命令 |
| q |
退出more |
less*****:分页显示文件内容 高级的more命令
| 参数选项 |
命令说明 |
| -i |
搜索时忽略大小写 |
| -m |
类似于more命令的进度百分比 |
| -N |
显示每行的行号 |
| -s |
将连续空行压缩为一行显示 |
| -e |
当文件显示到结尾时自动退出文件,若不使用此选项则需要使用交互式命令q退出less |
| 子命令 |
解释说明 |
| b |
向前翻一页 |
| 空格键 |
向后翻一页 |
| u |
向前翻半页 |
| d |
向后翻半页 |
| y |
向上滚动一行 |
| 回车键 |
向下滚动一行 |
| ↑ |
向上滚动一行 |
| ↓ |
向下滚动一行 |
| page up |
向前翻一页 |
| page down |
向后翻一页 |
| /字符串 |
向下搜索"字符串" |
| ?字符串 |
向上搜索"字符串" |
| n |
向后查找下一个匹配的文本 |
| N |
向前查找上一个匹配的文本 |
| v |
vi编辑界面 |
| !命令 |
调用Shell,并执行命令 |
| G |
移动到最后一行 |
| g |
移动到第一行 |
| h |
显示帮助界面 |
| q |
退出less命令 |
head*****:显示头部信息
| 参数选项 |
解释说明 |
| -n<行数> |
指定显示的行数,默认为10行 |
| -c<字节> |
指定显示的字节数 |
| -q |
不显示包含给定文件名的文件头 |
| -v |
总是显示包含给定文件名的文件头 |
tail*****:显示文件内容尾部
| 参数选项 |
解释说明 |
| -c<数目> |
指定显示的字节数 |
| -n<行数> |
指定显示的行数 |
| -f |
实时输出文件变化后追加的数据 |
| -F |
功能等同于-f --retry |
| --retry |
不停尝试打开文件直到打开为止,与-f参数合用 |
| --pid=进程号 |
-f参数连用,在进程结束后自动退出tail命令 |
| -s 秒数N |
监视文件变化的间隔秒数 |
| -q |
不显示包含给定文件名的文件头 |
| -v |
总是显示包含给定文件名的文件头 |
# 从第15行开始显示文件
tail -n +15 /etc/passwd # 扩展的用法,不常用
grep*****:文本过滤工具
| 参数 |
含义 |
| -v |
显示不包含匹配文本的所有行,反转 |
| -n |
显示匹配的行及行号 |
| -i |
不区分大小写(只适用于单字符),默认是区分大小写的 |
| -c |
只统计匹配的行数 |
| -E |
使用扩展的egrep命令 |
| --color=auto |
为grep过滤的匹配字符串添加颜色 |
| -w |
以单词为单位进行过滤 |
| -o |
只输出匹配的内容 |
# 显示所有行的行号,"."代表匹配任意单个字符,即匹配了所有的内容
grep -n '.' /etc/passwd
tr*****:替换或删除字符
| 参数选项 |
解释说明 |
| -d |
删除字符 |
| -s |
保留连续字符的第一个字符,删除其他字符 |
| -c |
使用第一个字符串的(set1)的补集,取反 |
tr 'abc' 'xyz' < test.txt # tr命令比较特殊,需要输入重定向符<
凡是在文本中出现的a全部替换为x,b替换为y,c替换为z
支持正则匹配,例:
tr '[a-z]' '[A-Z]' > test.txt # 小写转大写
Linux文件类型及查找命令
Linux文件属性概述
[root@grape tmp]# ll -ih
total 420K
67194889 -rw-r--r--. 1 root root 18 Jan 9 11:36 -
887635 drwxr-xr-x. 2 root root 37 Dec 30 11:31 12-27
33554508 drwxr-xr-x. 2 root root 37 Jan 5 18:18 12-27.ori
67193827 -rw-r--r--. 1 root root 0 Jan 9 09:31 123
{9IL_$RIFMU%X544F2Q1M8M.png
文件属性详解
第一列:Inode索引节点编号(相当于人的身份证,是唯一的);系统读取文件时首先通过文件名找到Inode号码,然后才能读取到文件内容
第二列和第三列:文件类型及权限.这一列共包含11个字符,其中第一个字符为文件类型,随后的9个字符为文件的对应权限,最后一个字符点号"."是与SELinux有关的一个标识
第四列:硬链接个数(参考ln命令).相当于超市的多个入口,可以从不同的文件入口进入文件,还可以互为备份.
第五列:文件或目录所属的用户(属主).在Linux系统中.文件和程序的存在必须要有用户和组满足相应的存在需求
第六列:文件或目录所属的组(属组)
第七列:文件或目录的大小
第八列:文件或目录的修改时间,默认为月、日、时、分
第九列:实际的文件名或目录名.需要注意的是,文件名不算文件的属性
Liunx文件类型及文件扩展名
| windows常见文件扩展名 |
代表的意义 |
| .docx |
word文件 |
| .pptx |
PPT演示文件 |
| .pdf |
PDF文件,更易读且不易修改的文档文件 |
| .jpg |
JPEG图像文件 |
| .avi |
视频文件 |
| .mp4 |
在线视频文件 |
| .gif |
GIF图像文件 |
| .rar |
压缩包文件 |
| linux常见文件扩展名 |
代表的意义 |
| .rpm |
RedHat系统二进制软件包文件 |
| .tar.gz |
压缩包文件(".tgz"、".tar"、".gz"也是压缩包文件) |
| .sh |
Shell脚本文件,通过Shell语言开发的程序 |
| .conf |
表示系统服务的配置文件 |
| 文件类型符号 |
代表的意义 |
| - |
regular file,表示普通文件,包含纯文本、二进制文件、数据文件等 |
| d |
directory,代表目录 |
| l |
link,代表符号连接或者软连接文件,类似于windows快捷方式,它指向的是文件的实体 |
| c |
character,代表字符设备文件,例如,串口设备、早起上网拨号用的猫 |
| b |
block,代表块设备,例如,硬盘、光驱 |
| s |
socket,代表套接字文件,进程之间进行通信时会用到 |
| p |
named pipe,表示管道文件 |
文件及目录查找命令
file****:显示文件的类型
| 参数选项 |
解释说明 |
| -b |
输出信息使用精简格式,不输出文件名 |
[root@grape tmp]# file /tmp/test1.ext /tmp /dev/vhci /dev/sda /dev/log /dev/rtc
/tmp/test1.ext: ASCII text
/tmp: sticky directory
/dev/vhci: character special
/dev/sda: block special
/dev/log: socket
/dev/rtc: symbolic link to `rtc0'
which*****:显示命令的全路径
which命令查找的范围是PATH环境变量的路径
| 参数选项 |
解释说明 |
| -a |
默认在PATH路径中由前往后查找命令,如果能够查找到,就停止匹配.使用-a选项将遍历所有的PATH路径,并输出所有匹配项 |
whereis****:显示命令及其相关文件全路径
whereis命令用于定位指定命令的可执行文件、源码文件及man帮助文件
| 参数选项 |
解释说明 |
| -b |
查找可执行文件 |
| -m |
查找man帮助文件 |
| -s |
查找源码文件 |
locale****:快速定位文件路径
在Linux系统有一个名为mlocate.db的数据库文件,这个文件包含系统文件的文件名及对应的路径信息.所以,locate命令查找文件时不用遍历磁盘,而是直接查找mlocate.db文件,这样就可以快速给出结果.使用locate命令时先updatedb更新下mlocate.db数据库文件.当然,mlocate.db还会由系统自带的定时任务执行updatedb命令定期更新
| 参数选项 |
解释说明 |
| -c |
不显示匹配的内容,只显示匹配的行数 |
| -i |
匹配时忽略大小写 |
| -r |
支持基本正则表达式匹配 |
| --regex |
支持扩展正则表达式匹配 |
/var/lib/mlocate/mlocate.db 查找的数据库文件
/etc/cron.daily/mlocate.cron 系统自带的定时任务脚本
/etc/cron.daily/mlocate 系统自带的定时任务脚本
updatedb***:更新mlocate数据库
创建或更新locate命令使用的数据库.updatedb命令会被定时任务(每天)执行.
| 参数选项 |
解释说明 |
| -U |
更新指定目录相关的数据库信息.默认是扫描整个系统,耗时较长,因此可以使用这个参数 |
| -v |
显示命令的执行过程 |
find*****:查找目录下的文件
| 参数选项 |
解释说明 |
| pathname |
命令所查找的目录路径,用"."来表示当前目录,"/"表示系统根目录 |
| Options模块 |
|
| -depth |
从指定目录下最深层的子目录开始查找 |
| -maxdepth levels |
查找的最大目录级数,levels为自然数 |
| -regextype type |
改变正则表达式的模式.默认为emacs,还有posix-awk、posix-basic、posix-egrep、posix-extended |
| Tests模块 |
|
| -mtime[-n|n|+n] |
按照文件的修改时间来查找文件(这个参数最常用),具体说明如下:1.-n表示文件更改时间距现在n天以内;2.+n表示文件更改时间距现在n天以前;3.n表示距现在第n天 |
| -atime[-n|n|+n] |
按照文件的访问时间来查找文件,单位是天 |
| -ctime[-n|n|+n] |
按照文件的状态改变时间来查找文件,单位是天 |
| -amin |
按照文件的访问时间来查找文件,单位是分钟 |
| -cmin |
按照文件的状态改变时间来查找文件,单位是分钟 |
| -mmin |
按照文件的修改时间来查找文件,单位是分钟 |
| -group |
按照文件所属的组来查找文件 |
| -name |
按照文件名查找文件,只支持""、"?"、"[]"等特殊通配符* |
| -newer |
查找更改时间比指定文件新的文件 |
| -nogroup |
查找没有有效用户组的文件,即该文件所属的组在/etc/groups中不存在 |
| -nouser |
查找没有有效属主的文件,即该文件的属主在/etc/passwd中不存在 |
| -path pattern |
指定路径样式,配合-prune参数排除指定目录 |
| -perm |
按照文件权限来查找文件 |
| -regex |
接正则表达式 |
| -iregex |
接正则表达式,不区分大小写 |
| -size n[cwbkMG] |
查找文件长度为n块的文件,带有cwbkMG时表示文件长度以字节计 |
| -user |
按照文件的属主来查找文件 |
| -type |
查找某一类型的文件,具体说明为:1.b(块设备文件) 2.c(字符设备文件) 3.d(目录) 4.f(普通文件) 5.p(管道文件) 6.l(符号链接文件) 7.s(socket文件) 8.D(door) |
| Actions模块 |
|
| -delete |
将查找出的文件删除 |
| -exec |
对匹配的文件执行该参数所给出的shell命令 |
| -ok |
与-exec作用相同,但在执行每个命令前,都会让用户来确定是否执行 |
| -prune |
使用这一选项可以使find命令不在当前指定的目录中查找 |
| -print |
将匹配的文件输出到标准输出(默认功能,使用中可省略) |
| OPERATORS |
|
| ! |
取反 |
| -a |
取交集,全拼为and |
| -o |
取并集,全拼为or |
# 1.查找指定时间内修改的文件
find . -atime -2 # 查找当前目录两天内被访问的文件
# 2.利用"!"进行反向查找
find . ! -type d
# 3.按照目录或文件的权限查找文件
find . -perm 755 # 755是权限的数字表示方式
# 4.按大小查找文件
find . -size +1000c # 查找当前目录下文件大小大于1000字节的文件
# 5.查找文件时希望忽略某个目录
find /data -path "/data/dir1" -purne -o -print # 参数-path用于指定路径样式,配合-purne参数用于排除指定目录
# -path "/data/dir1" -purne -o -print 是 -path "/data/dir1" -a -purne -o -print的简写,-a和-o类似于shell中的"&&"和"||",当-path "/data/dir1"为真时执行-prune,为假时执行-print
# 6.忽略多个目录
find /data \(-path /data/dir1 -o -path /data/dir2 \) -purne -o -print
# 使用圆括号可以将多个表达式结合在一起,但是圆括号在命令行中另有特殊含义,所以在此处使用"\"进行转义,即告诉bash不对后面的字符"()"作解析,而是留给find命令处理
# 7.使用nouser和user
chown nobody:nobody file1.txt
find . -user nobody # 查找用户为nobody的文件
chown 555 file1.txt # 修改为数字555
find . -nouser # 查找数字属主就要使用-nouser参数,查找没有任何用户的文件
# 8.使用group和nogroup
find . -group nobody # 查找用户组为nobody的文件
chown .555 file1.txt
find . -nogroup
# 9.查找某个文件新或旧的文件
find . -newer file1.txt ! -newer file2.txt # 查找更改时间比file1新但比file2旧的文件
# 10.逻辑操作符
find . -maxdepth 1 -type d # 查找一级目录,类似于tree -L 1
find . -maxdepth 1 -type d ! -name "." -o -name "ext" # 查找除"."意外的所有目录或文件名为ext的文件
# 11.find正则表达式的用法
语法 find -regextype "type" -regex "pattern"
# 12.ls -l命令放在dind命令的-exec选项中执行
find . -type f -exec ls -l {} \; # 匹配当前目录下的所有普通文件,并在-exec选项中使用ls -l列出
详细说明:
-exec后面跟的是command命令,最后以分号(;)作为结束标志,考虑到各个系统中分号会有不同的意义,所以前面要加反斜杠对分号进行转义
{}的作用:指代前面find命令查找到的文件或目录
{}前后都要有空格
# 13.在目录中查找更改时间在n天以前的文件,并删除它们
find . -type f -mtime +n -exec rm {} \;
# 14.-exec的安全模式-ok
在删除或其他操作之前给出提示,这样操作会比较安全
# 15.对查找到的文件内容显示属性信息
find . -type f|xargs ls -l # xargs是一个命令,是向其他命令传递参数的一个过滤器
# 16.使用xargs执行mv命令
find . -type f -name "*.txt"|xargs -i mv {} /tmp # -xargs的-i参数,使得{}代表find查找到的文件,将这些文件以参数的形式放在mv命令后面,作为移动的源文件,移动到/tmp目录下
# 17.find结合xargs的-p选项的示例
find dir2 -name "file*"|xargs -p rm -f # 使用xargs的-p参数会提示让你确认是否执行后面的命令
# 18.技巧性范例
find /root/data -name "test.txt"|xargs rm -f
find /root/data -name "test.txt" -exec rm -f {} \;
# 19.在oldboy目录及其子目录下的所有以扩展名".sh"结尾的文件中,将包含"./hostlists.txt"的字符串替换为"../idctest_iplist"
sed -i "s#./hostlists.txt#../idctest_iplist/g" 文件名
-i:将替换结果写入到文件
s:s是替换模式
g:global全局替换
find /oldboy -name "*.sh" -exec sed -i "s#./hostlists.txt#../idctest_iplist/g" {} \;
find /oldboy -name "*.sh"|xargs sed -i "s#./hostlists.txt#../idctest_iplist/g"
高效处理方法,优先处理反引号中的命令
"s#./hostlists.txt#../idctest_iplist/g" `find /oldboy -name "*.sh"`
# 20.将etc下所有的普通文件打包成压缩
find /etc -type f -exec tar zcvf test.tar.gz {} \;
find /etc -type f|xargs tar zcvf test.tar.gz
tar zcvf test.tar.gz `find /etc -type f`
# 21.删除一个目录下的所有文件名单保留一个文件
touch test{1..10}.txt
find . -type f ! -name "test10.txt"|xargs rm -f (推荐方法)
find . -type f ! -name "test10.txt"|-exec rm -f {} \; (文件多时效率低)
使用rsync
mkdir /null # 建立一个空目录用于rsync删除文件使用
[root @mango xx]# rsync -az --delete --exclude "test10.txt" /null /xx
# 22.保留最近7天的访问日志
find /app/logs -type f -mtime +7 -name "*.log"|xargs rm -f
find /app/logs -type f -mtime +7 -name "*.log" -exec rm -f {} \;
find /app/logs -type f -mtime +7 -name "*.log" -delete
CustomLog "|/usr/local/sbin/cronlog /app/logs /access_www_%w.log" combined
find命令结合xargs与-exec的区别
| 区别 |
-exec |
xargs |
| 区别一 |
该参数是将查找的结果文件名逐个传递给后面的命令来执行,如果文件多时则执行的效率低 |
该命令是将查找的结果一次性传给后面的命令执行,命令执行效率高,可以使用-n参数控制一次传递文件的个数 |
| 区别二 |
文件若有空格等特殊字符也照常处理 |
处理特殊文件名(例如,文件名有空格)需要采用特殊方式(find . -name "*edu*" -print0|xargs -0 ls -lh) |
xargs****:将标准输入转换成命令行参数
| 参数选项 |
解释说明 |
| -n |
指定每行最大参数量n,可以将标准输入的文本划分为多行,每行n个参数,默认空格符分隔 |
| -d |
自定义分隔符 |
| -i |
以{}代替前面的结果 |
| -I |
指定一个符号替代前面的结果,而不用-i参数默认的{} |
| -p |
提示让用户确认是否执行后面的命令 |
| -0(数字0) |
用null代替空格作为分隔符,配合find命令的-print0选项的输出使用 |
xargs < test.txt # 将所有数字变成一行,注意xargs不能直接接文件,需要结合重定向符"<"
xargs -n 3 < test.txt # 每行最多输出3个
echo splitXsplitXsplitXsplitXsplitXsplitX -d X -n 2
split split
split split
split split
假如有个hello world.txt文件
find . -type f -name "*.txt"|xargs rm # 报错,xargs会误认为hello world.txt是两个文件
正确语法
find . -type f -name "*.txt" -print0|xargs -0 rm # 以字符null分隔输出
tar*****:打包压缩命令
| 参数选项 |
解释说明 |
| z |
通过gzip压缩或解压 |
| c |
创建新的tar包 |
| v |
显示详细的tar命令执行过程 |
| f |
指定压缩文件的名字 |
| t |
不解压查看tar包的内容 |
| p |
保持文件的原有属性 |
| P(大写) |
以绝对路径打包,危险参数 |
| j |
通过bzip2命令压缩或解压 |
| x |
解开tar包 |
| C |
指定解压的目录路径 |
| --exclude=PATTERN |
打包时排除不需要处理的文件或目录 |
| -X 文件名 |
从指定文件读取不需要处理的文件或目录列表 |
| -N 日期 |
仅打包比指定日期新的文件,可用于增量打包备份 |
| -h |
打包软连接文件指向的真实源地址 |
| --hard-dereference |
打包硬链接文件 |
打包软连接文件示例
tar zcf local.tar.gz /etc/rc.local # 不指定h参数打包之后的文件将是个软连接文件么不是rc.local实体内容,查看文件内容为空
tar zcfh local.tar.gz /etc/rc.local # 指定h参数打包,得到rc.local的实体内容
date*****:显示与设置系统时间
| 参数选项 |
解释说明 |
| OPTION参数选项 |
|
| -d 时间字符串 |
显示指定字符串所描述的事件,而非当前时间 |
| -f 时间文件 |
从日期文件中按行读入时间描述 |
| -r 文件 |
显示指定文件的最后修改时间 |
| -s 日期时间 |
设置系统时间 |
| -u |
显示或设置UTC时间 |
| FORMAT日期格式 |
|
| %% |
输出字符% |
| %a |
星期名缩写Sun |
| %A |
星期名全称Sunday |
| %b |
月名缩写Jan |
| %B |
月名全称January |
| %c |
日期和时间(Sun 12 Jan 2020 06:50:03 PM CST) |
| %C |
世纪 |
| %d |
每月的第几天 |
| %D |
等于%m/%d/%y |
| %e |
每月的第几天 |
| %F |
完整的日期格式,等价于%Y-%m-%d |
| %g |
年份的最后两位数字 |
| %G |
年份 |
| %h |
月名缩写,等于%b |
| %H |
24小时制 |
| %I |
12小时制 |
| %j |
一年的第几天 |
| %k |
24小时制,格式与%H不同 |
| %l |
12小时制 |
| %m |
月份 |
| %M |
分 |
| %n |
换行 |
| %N |
纳秒(000000000-999999999) |
| %p |
"上午"或"下午",未知时输出为空(AM/PM) |
| %P |
与%p类似,但是输出的是小写字母(am/pm) |
| %r |
当下时区的12小时制 |
| %R |
24小时制的时和分,等价于%H:%M |
| %s |
自UTC时间1970-01-01 00:00:00 以来所经过的秒数 |
| %S |
秒 |
| %t |
输出制表符Tab |
| %T |
时间,等于%H:%M:%S |
| %u |
星期 |
| %U |
一年中的第几周,以周日为每星期的第一天 |
| %w |
一星期中的第几日,0代表周一 |
| %W |
一年中的第几周,以周一为每星期的第一天 |
| %x |
日期(如01/12/2020) |
| %X |
时间(如07:07:06 PM) |
| %y |
年份的最后两位 |
| %Y |
年份 |
date +%F -d "-2day" # 前天
date +%F -d "+2day" # 后天
+表示未来,-表示过去,day表示日,year表示年,month表示月
时间格式转换
date -d "Sun 12 Jan 2020 06:50:03 PM CST" "+%Y-%m-%d %H:%M:%S"
date -d "Sun Jan 12 11:17:02 UTC 2020" "+%Y-%m-%d %H:%M:%Sdate -s "20200523 07:18:54"
date -s "20200523 07:18:54"
Linux文件核心属性知识
用户和用户组
用户
- UID(User Identify):用户ID,相当于身份证,在系统中是唯一的
- GID(Group Identify):组ID,相当于家庭住址
| UID整数范围 |
角色 |
具备该UID的用户特性 |
| 0 |
超级用户(皇帝) |
当用户的UID为0时,表示这个账号为超级管理员账号,如果要增加一个系统管理员,则只需将该账号的UID改为0即可.不建议这么做,建议用sudo替代 |
| 1~999 |
虚拟用户(傀儡) |
这是保留给系统使用的UID,为了防止人为建立账户的UID和系统UID之间发生冲突 |
| 1000~60000 |
普通用户(老百姓) |
使用useradd建立账户时,默认UID从1000开始 |
- 生产环境中,一般禁止root账号通过SSH远程连接服务器,也会更改默认的SSH端口.
- 在企业工作中,应该尽量在普通用户下操作任务.
- 普通用户仅具备操作自己家目录中的文件及目录的权限,可以进入或浏览相关目录(/etc、/var/log),但是无法创建、修改和删除任何文件
- 虚拟用户是系统正常运行必不可少,主要是为了方便系统管理,满足相应的系统进程对文件属主的要求.例如,系统默认的bin、adm、nobody、mail用户等
用户组
- 具有相同特征的用户(user)集合
- 将用户分组是Linux系统中对用户进行管理及控制访问权限的一种手段
用户和用户组的对应关系
-
一对一:一个用户可以存在一个组中,也可以是组中的唯一成员(root)
-
一对多:一个用户可以存在于多个用户组中
-
多对一:多个用户可以存在于一个组中,这些用户具有与组相同的权限
-
多对多:多个用户可以存在于多个组中,并且几个用户可以归属于相同的组
创建用户及用户组
useradd maomao # 添加用户maomao,会默认创建一个maomao用户组,默认属于与用户同名的组
[root@grape ~]# id maomao 查看maomao用户、组及ID信息
uid=1001(maomao) gid=1001(maomao) groups=1001(maomao)
[root@grape ~]# su - maomao 切换到maomao用户
[maomao@grape ~]$ # 提示符变为了$
[maomao@grape ~]$ pwd # 当前所在位置是在用户家目录
/home/maomao
[maomao@grape ~]$ touch test.txt # 创建文件
[maomao@grape ~]$ ll
total 0
-rw-rw-r--. 1 maomao maomao 0 May 23 07:57 test.txt # 目录/文件默认属于创建它的用户和组
文件生成一定是由用户创建,因此文件也必须要属于一个用户及组,默认就是属于创建它的用户和组
文件权限说明
rwxr-xr-x root root test.txt # 每3个字符分为一组
属主权限位:rwx
属组权限位:r-x
其他用户权限位:r-x
-
r、w、x、"-"的含义
- r(read):可读权限,对应数字4
- w(write):可写权限:对应数字2
- x(Execute):可执行权限:对应数字1
- "-"没有任何权限:对应数字0
还会有一些特殊的权限位t、T、s、S、X、x、+
索引节点
Linux磁盘存储数据的描述
- 磁盘要存储数据,相当于盖房子住人
- 磁盘要分区才能存储数据
- 格式化磁盘,创建文件系统存储数据
- 挂载到指定目录(挂载点)存放数据
索引节点详细说明
索引节点(Index node,Index)在每个Linux存储设备(磁盘或硬盘)或存储设备的分区(此时的存储设备可以是硬盘、软盘、U盘等等)中被格式化为ext系列文件系统之后,都会生成两部分内容:第一部分是Inode(默认大小为128或256字节),第二部分是block(默认大小为1~4KB).由于磁盘或分区一般比较大,因此,Inode和Block都会存在很多个,并且都可以存放数据信息
Inode本质上是一小块具备唯一数字编号的存储空间,主要用来存放文件(目录)属性(例如ls -l的结果)的数据信息,注意,Inode里面唯独不包含文件名本身(文件名不算文件的属性)
Block成为磁盘块,是用来存放实际数据的实体单元(ext文件系统一般最大为4KB),即用来存放真正的数据,例如,照片、视频等普通文件,单个的大文件需要占用多个Block块来存储,特别小的单个文件如果不能占满整个Block块,那么剩余的空间也无法再利用
Inode存储的属性信息(即ls -l的结果),包括但不限于文件大小,属主(用户)、归属的用户组、文件权限、文件类型、"修改"时间等,还包含指向文件的实体指针等(Block的位置,即Inode节点与Block的对应关系)
Inode与Block的关系
- Inode除了要记录文件属性的信息之外,还会为每个文件进行信息索引,所以就有了Inode数值.操作系统根据指令,即可以通过Inode的值最快速地找到相对应的文件实体
Inode与Block的特点
- Inode特点
- ext3/ext4文件系统(CentOS5.x/6.x默认的文件系统)下,一个非空文件有且只有一个Inode和至少一个Block
- Inode节点相同的文件,互为硬链接文件,可以认为是一个文件的不同入口
- Inode在某一文件系统(分区)内是唯一的
- Block特点
- 磁盘读取数据是以Block为单位进行读取的
- 每读取一个Block就会消耗一次磁盘I/O
- 若文件比较大,那么一个文件可能占用多个Block
- 若文件比较小,那么一个Block的剩余空间会被浪费,无论内容有多小
查看Inode和Block
[root@grape tmp]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/centos-root 26214400 84355 26130045 1% /
devtmpfs 229861 392 229469 1% /dev
tmpfs 232903 1 232902 1% /dev/shm
tmpfs 232903 743 232160 1% /run
tmpfs 232903 16 232887 1% /sys/fs/cgroup
/dev/sda1 524288 327 523961 1% /boot
/dev/mapper/centos-home 24637440 5143 24632297 1% /home
tmpfs 232903 1 232902 1% /run/user/0
[root@grape tmp]# df -h # Block是存放数据的位置,数据实体
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 50G 2.2G 48G 5% /
devtmpfs 898M 0 898M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 18M 893M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda1 1014M 146M 869M 15% /boot
/dev/mapper/centos-home 47G 303M 47G 1% /home
tmpfs 182M 0 182M 0% /run/user/0
磁盘空间满了故障总结
- Block耗尽的情况:500G的磁盘存放400G+200G的视频
- Inode耗尽的情况:产生了大量的小文件(小于1kb)
硬链接及软链接数
链接的概念
- 在Linux系统中,链接可分为两种:一种为硬链接(Hard Link),另一种为软链接(Soft Link)或符号链接(Symbolic Link)
- 默认不带参数的情况下,ln命令创建的链接式硬链接
- 如果是ln -s创建的链接,则为软链接,软链接文件的文件类型为l
- ln -s 原始文件 目标文件(目标文件不能事先存在)
硬链接
- 硬链接是指通过索引节点(Inode)进行的链接.在CentOS6及以前的Linux(ext2、ext3、ext4)默认文件系统中,存在于磁盘分区中的文件都会分配一个唯一的编号,这个标号就称为索引节点编号(Index Inode),在Linux同一文件系统中该编号是唯一的
- Linux系统中,多个文件名指向同一个索引节点(Inode号相同)是正常且被允许的.这种情况下的两个文件就称作互为硬链接文件,本质上就是相同文件的两个名字.在同一个分区/文件系统中,Inode号相同的文件一定是硬链接文件
- 硬链接文件相当于是原始文件的另一个访问入口.作用之一是允许一个文件拥有多个有效的文件名(多个访问入口,类似超市的多个入口),这样用户就可以建立硬链接到重要文件上,为避免"误删"源数据加一份保险(快照功能)
- 文件系统(ext)的原理是,只要文件的索引节点(Inode Index)还有一个以上的硬链接,那么,只删除其中的一个硬链接(即仅仅删除了该文件的链接指向)并不会影响索引节点本身和其他的链接(即数据文件实体并未删除),只有在文件的最后一个硬链接被删除后,此时如果有新数据要存储到硬盘上,或者系统通过类似的fsck做磁盘检查的时候,被删除文件的数据块及目录的链接才会被释放,空间被新数据占用并覆盖.数据也就无法被找回
- 也就是说,在Linux系统中,删除静态文件(没有进程调用的文件)的条件是与之相关的所有硬链接文件均被删除.一个静态文件被彻底删除的条件就是该文件的硬链接数量为0
小结:
- 具有相同Inode节点号的多个文件互为硬链接文件,本质上是相同文件的不同文件名
- 删除硬链接文件或者源文件任意之一,文件实体并未被删除
- 只有删除了源文件及源文件对应的所有硬链接文件,文件实体才会被删除
- 待所有的硬链接文件及源文件均被删除后,再存放新的数据时,新数据会占用这个文件的空间.磁盘进行fsck检查的时候,删除的数据就会被系统回收
- 硬链接文件就是文件的另一个入口
- 可以通过对文件设置硬链接文件,来防止重要文件被误删
- 通过执行命令"ln 源文件 硬链接文件",即可完成硬链接的创建
- 硬链接就是普通文件
- 对于静态文件(没有进程正在调用的文件)来讲,当对应的硬链接数为0(i_link)时,文件就被删除.查看方式为ls -lhi
- 创建硬链接只能针对文件,不能是目录
image-20200113092153032.png
软链接
- 软链接(Soft Link)也称为符号链接(Symbolic Link,symlink).Linux中的软链接类似于windows系统中的快捷方式.软链接文件实际是一个特殊的文件,文件类型用字母l表示.可以将它理解为一个文本文件,这个文件中包含有软链接,其指向的是另一源文件的位置信息内容,因此,访问这个"快捷方式"就可以迅速定位到软链接所指向的源文件实体
- 软链接创建的方式为:ln -s 源文件 软链接文件
- 要想创建软链接,那么目标文件是不能存在的
- 软链接文件通过自身的Inode(存放原始文件路径信息,而不是读取Block),读到了软链接信息,并指向了原始文件,进而读到原始文件名,以及原始文件的Inode,再通过原始文件的Inode读到原始文件的内容(Block),这就是访问软链接文件来读取数据的原理
- 早期的软链接是读取自己的Block以获取原始文件的路径信息,但是这样的访问方式效率很低,对于Linux系统来说,有一种更好的方法,成为fastsymlinks,原理就是软链接的Block不存放源文件位置了,而是直接将源文件位置存放在Inode里面,即省事又快捷
image-20200113091715319.png
[root@grape tmp]# ll -i
硬链接 67919040 -rw-r--r--. 2 root root 16 Jan 13 08:51 music_hard.txt
软链接 67160667 lrwxrwxrwx. 1 root root 9 Jan 13 08:50 music_soft.txt -> music.txt
原始文件 67919040 -rw-r--r--. 2 root root 16 Jan 13 08:51 music.txt
软链接文件的Inode和文件类型都是不同的,软链接文件是单独的文件
[root@grape tmp]# readlink music_soft.txt 查看软链接文件的指向
music.txt
[root@grape tmp]# rm f music.txt 删除原始文件
[root@grape tmp]# cat music_soft.txt
cat: music_soft.txt: No such file or directory 直接报错
软链接会出现底闪烁故障
67160667 lrwxrwxrwx. 1 root root 9 Jan 13 08:50 music_soft.txt -> music.txt
小结:
- ln命令不能对目录创建硬链接,但可以对目录创建软链接
- 软链接类似于Windows的快捷方式(通过readlink查看其指向)
- 软链接类似于一个文本文件,里面存放的是源文件的路径,指向源文件的实体
- 删除源文件,软链接文件依然存在,但是无法访问指向源文件路径的内容
- 失效的时候一般是红底白字闪烁
- 执行命令"ln -s 源文件 软链接文件",即可完成软链接的创建(目标不能存在)
- 软链接和源文件是不同类型的文件,也是不同的文件,Inode号也不相同
- 软链接文件的文件类型为字母(l)
- 软链接不仅针对文件,还可以针对目录
软链接与硬链接的区别
- 答分类:Linux系统中,链接可分为两种,一种称为硬链接(Hard Link),另一种称为符号链接(Symbolic Link)或软链接(Soft link)
- 答概念:硬链接与源文件的Inode节点号相同,而软链接文件则相当于Windows下的快捷方式(Inode节点号与源文件不同)
- 答创建:默认不带参数的情况下,ln命令创建的是硬链接,带-s参数创建的是软链接
- 答特点:
- 不能对目录创建硬链接,但可以创建软链接
- 软链接可以跨文件系统,硬链接不能跨文件系统
- 删除软链接文件,对源文件以及硬链接文件无任何影响
- 删除文件的硬链接文件,对源文件及软链接文件无任何影响
- 删除链接文件的源文件,对硬链接文件无影响,会导致其软链接失效(红底白字闪烁)
- 同时删除源文件及其硬链接文件,整个文件才会被"真正"删除
- 答案例:硬链接用处不多,可以用来对重要文件做快照以防误删,对目录建立软链接在工作中很常用
Linux系统文件删除原理
1.从ext文件系统的角度
- Linux系统上的文件名是存储在父目录的Block里面的,并指向了这个文件的Inode节点,这个文件的Inode节点再标记指向存放这个文件的Block的数据块.在删除一个文件时,实际上并不会清除Inode节点和Block的数据.只是在这个文件的父目录中的Block里,删除这个文件的名字,从而使这个文件消失,并且无法指向这个文件的Inode节点.当没有文件名指向这个Inode节点的时候,释放Inode节点和存放这个文件数据的Block块会同时进行,并且会更新Inode MAP和Block MAP,以便让这些位置用于存放其他文件数据
2.从文件引用的角度
- Linux系统是通过Link的数量来控制文件是否被删除,只有当一个文件不存在任何Link的时候,这个文件才会被删除.一般来说,每个文件都有2个计数器,即i_count和i_nlink
-
i_nlink就是文件硬链接的数量,i_nlink可以理解为磁盘的引用计数器;i_count就是当前文件使用者(例如,被进程调用)的数量,i_count可以理解为内存的引用计数器.当为文件创建硬链接的时候,对应的i_nlink的数量就会增加,而当一个文件被某一个进程调用时,对应i_count的数量就会增加
- 通过rm删除命令删除文件,实际就是减少文件的磁盘引用计数i_nlink的数量
- 在用户执行rm操作删除文件之后,再执行ls或者其他文件管理命令,将会无法再找到这个文件,但是调用这个被删除文件的进程却在继续正常执行,依然能够从文件中正确地读取及写入内容
- 这是因为rm操作只是将文件的i_nlink数减少了,如果没有其他的链接,i_nlink就位0;但是由于该文件依然在被进程调用,因此,此时文件对应的i_count并不为0,所以即使执行了rm操作,但系统没有真正删除这个文件,因此该文件还会占用磁盘空间,只有当i_nlink及i_count都为0的时候,这个文件才会真正被删除.也就是说,还需要解除该进程对该文件的调用,被删除的文件才会真正被删除
- 当文件没有被进程调用时进行删除,也可以找回文件数据.先是将文件名到Inode的链接删除了,此时,并没有删除文件的实体即Block数据块,如果及时停止机器工作,数据还是可以找回的,但如果此时继续写入数据,那么新的数据可能就会被分配到被删除数据的Block数据块了,此时,文件就是被真正地回收了
image-20200113112251317.png
chattr***:改变文件的扩展属性
| 参数选项 |
解释说明 |
| -R |
递归更改目录属性 |
| -V |
显示命令的执行过程 |
| mode |
|
| + |
增加参数 |
| - |
移除参数 |
| = |
更新为指定参数 |
| A |
告诉系统不要修改这个文件的最后访问时间 |
| a |
只能向文件中添加数据,而不能删除,多用于服务器日志文件安全 |
| i |
设定文件不能被删除、改名、写入或新增内容 |
chattr +a 文件名
chattr +i 文件名
lsattr***:查看文件扩展属性
| 参数选项 |
解释说明 |
| -R |
递归查看目录扩展属性 |
| -a |
显示所有文件包括隐藏文件的扩展属性 |
| -d |
显示目录的扩展属性 |
Linux通配符与特殊符号知识
通配符符号集合
| 符号 |
作用 |
| * |
匹配任意(0个或多个)字符或字符串,包括空字符串 |
| ? |
匹配任意一个字符,有且只有一个字符 |
| 字符集合 |
|
| [abcd] |
匹配abcd中任何一个字符,abcd也可以是其他任意不连续字符 |
| [a-z] |
匹配a到z之间的任意一个字符,字符前后要连续,也可以用连续数字,[1-9] |
| [!abcd] |
表示不匹配括号里面的任何一个字符,也可书写为[!a-d],这里的"!"可以用"^"替代,即[^abcd]
|
路径和位置相关特殊符号
| 符号 |
作用 |
| ~ |
用户的家目录,超级用户为/root,普通用户为/home |
| - |
代表上一次(相对于当前路径)用户所在路径 |
| . |
代表当前目录 |
| .. |
代表上一级目录 |
不同引号特殊符号
| 名称 |
解释 |
| 单引号('') |
所见即所得,即输出单引号内容时会将单引号内的所有内容都原样输出,或者描述为单引号里面看到的是什么就会输出什么,称为强引用 |
| 双引号("") |
输出双引号内的所有内容时,如果内容中有命令(要反引一下)、变量、特殊转义符等,会先将变量、命令、转义字符解析出结果,然后再输出最终内容,称弱引用.推荐使用弱引用 |
| 无引号 |
赋值时,如果变量内容包含了空格则会使得赋值不完整.而在输出内容时,也会将含有空格的字符串视为一个整体输出;如果内容中有命令(要反引下)、变量等,则会将变量、命令解析出结果,然后输出最终内容;如果字符串中带有空格等特殊字符,则有可能无法完整的输出,因此需要加双引号.一般连续的字符串、数字、路径等可以不加任何引号赋值和输出,不过无引号的情况最好使用双引号替代,特别是对变量赋值时 |
| 反引号(``) |
一般用于引用命令,执行的时候命令会被执行,相当于"$()",赋值和输出都要将命令用反引号``引起来 |
其他特殊符号
| 名称 |
解释 |
| ; |
表示一个命令的结束,也是命令间的分隔符 |
| # |
1)表示是注释内容,是用来给管理员看的,系统不会执行以'#'号开头的内容 2)root用户的命令提示符 |
| | |
表示管道,将一个命令处理后的中间内容输出给下一个命令继续处理 |
| $ |
1)字符串前加"$"符号,代表字符串变量内容 2)代表普通用户的命令提示符 |
| \ |
逃脱符,即将含有特殊含义的字符(通配符或正则表达式)还原成字符本意 |
| {} |
1)生成序列 2)引用变量作为变量与普通字符的分隔 |
Bash中的逻辑操作符
| 名称 |
解释 |
| && |
前一个命令执行成功,再执行后一个命令 |
| || |
前一个命令执行失败,再执行后一个命令 |
| ! |
1)在Bash中表示取反 2)在vi/vim中表示强制 3)"!ls"表示找出最近一次以ls开头的命令并执行 |
基本正则表达式集合
| 字符 |
作用 |
| ^ |
尖角号,用法为"^mango",表示以匹配mango单词开头的行 |
| $ |
美元符,用法为"mango$",表示以匹配mango单词结尾的行 |
| ^$ |
组合符,表示空行,逻辑解释就是以"^"结尾的行,或者以"$"开头的行 |
| . |
点号,表示匹配任意一个且只有一个字符(不能匹配空行) |
| \ |
转义字符,让有特殊含义的字符脱掉马甲,现出原形,如"\."只表示小数点 |
| * |
匹配前一个字符(连续出现)0次或1次以上. 注意,当重复0次的时候,表示什么也没有(空),即匹配所有内容 |
| .* |
组合符,匹配所有内容 |
| ^.* |
组合符,匹配以任意多个字符开头的内容 |
| .*$ |
组合符,匹配任意多个字符结尾的内容 |
| [abc] |
匹配"[]"集合内的任意一个字符a或b或c;也可写成[a-c] |
| [^abc] |
匹配不包含""后的任意字符a或b或c,这里的""表示对[abc]的取反,此处的"^"不能用"!"替代 |
扩展正则表达式
| 字符 |
作用 |
| + |
匹配前一个字符1次或多次 |
| [:/] |
匹配括号内的":"或"/"字符1次或多次 |
| ? |
匹配前一个字符0次或1次 |
| | |
表示或者,即同时过滤多个字符串 |
| () |
分组过滤,被括起来的内容表示一个整体,另外"()"的内容可以被后面的"\n"引用,n为数字,表示引用第几个括号的内容 |
| \n |
引用前面"()"小括号里的内容,例如,(aa)\1,匹配aaaa |
| a{n,m} |
匹配前一个字符最少n次,最多m次 |
| a{n,} |
匹配前一个字符最少n次 |
| a{n} |
匹配前一个字符正好n次 |
| a{,m} |
匹配前一个字符最多m次 |
预定义特殊中括号
| 正则表达式 |
描述 |
示例 |
| [:alnum:] |
匹配任意一个字母或数字字符,相当于[a-zA-Z0-9] |
[[:alnum:]] |
| [:alpha:] |
匹配任意一个大小写字母字符,相当于[a-zA-Z] |
[[:alpha:]] |
| [:blank:] |
空格与制表符(横向和纵向) |
[[:blank:]] |
| [:digit:] |
匹配任意一个数字字符,相当于[0-9] |
[[:digit:]] |
| [:lower:] |
匹配小写字母,相当于[a-z] |
[[:lower:]] |
| [:upper:] |
匹配大写字母,相当于[A-Z] |
[[:upper:]] |
| [:punct:] |
匹配标点符号 |
[[:punct:]] |
| [:space:] |
匹配一个包括换行符、回车等在内的所有空白符 |
[[:space:]] |
| [:graph:] |
匹配任何一个可以看得见的且可以打印的字符 |
[[:graph:]] |
| [:xdigit:] |
任何一个十六进制数(即0-9,a-f,A-F) |
[[:xdigit:]] |
| [:cntrl:] |
任何一个控制字符(ASCII字符集中的前32个字符) |
[[:cntrl:]] |
| [:print:] |
任何一个可以打印的字符 |
[[:print:]] |
元字符表达式
| 表达式 |
描述 |
| \b |
匹配单词边界,例如\bmango\b只匹配mango单词不匹配mango* |
| \B |
匹配非单词边界,例如,mango\B匹配mango123中的mango,不匹配单独的oldboy单词 |
| \w |
匹配字母、数字与下划线,等价于[_[:alnum:]] |
| \W |
匹配字母、数字与下划线以外的字符,等价于[^_[:alnum:]]
|
| \d |
匹配单个数字字符,注意,这个表达式需要使用grep -P参数才能识别 |
| \D |
匹配单个非数字字符,注意,这个表达式需要使用grep -P参数才能识别 |
| \s |
匹配1位空白字符,注意,这个表达式需要使用grep -P参数才能识别 |
| \S |
匹配1位非空白字符,注意,这个表达式需要使用grep -P参数才能识别 |
sed*****:流编辑器
常用参数选项
| options[选项] |
解释说明 |
| -n |
取消默认sed的输出,常与sed内置命令的p连用 |
| -i |
直接修改文件内容,而不是输出到终端.如果不使用"-i"选项则sed只是修改存储在内存中的数据,并不会影响磁盘上的文件 |
| -e |
允许多次编辑 |
常用内置命令字符
| sed内置符 |
解释说明 |
| a |
全拼append,表示追加文本,在指定行后添加一行或多行文本 |
| d |
全拼delete,表示删除匹配行的文本 |
| i |
全拼insert,表示插入文本,在指定行前添加一行或多行文本 |
| p |
全拼print,表示打印匹配行的内容,通常p会与选项"-n"一起使用 |
| s/regexp/replacement/g |
匹配regexp部分内容,用replacement替换regexp匹配的内容,regexp部分可以使用正则表达式,在replacement部分可以使用特殊字符"&"和"\1-\9"等匹配regexp的部分内容.s/regexp/replacement/g结尾常与g匹配做全局替换 |
# 示例
1.输出文件的第2-3行内容
sed -n '2,3p' 文件名
2.过滤出含有mango的字符
sed -n '/mango/p' 文件名 # 需要用双斜线将需要过滤的字符串包含在中间
3.删除含有mango字符串的行
sed '/mango/d' 文件名 # 如果需要修改文件,则要用-i参数
4.删除指定的行
sed '3d' 文件名
sed '5,8d' 文件名 # 删除第5~8行
5.将mango字符串全部替换为apple
sed -i 's#mango#apple#g' 文件名 # s表示替换模式,g表示全局替换
6.将mango字符串全部替换为apple,同时将1替换为2
sed -e 's#mango#apple#g' -e 's#1#2#g' 文件名
7.在文件的第二行追加文本
sed -i '2a hello,world' 文件名
8.在文件的第二行插入文本
sed -i '2i hello,world' 文件名
9.在文件的第二行插入两行文本
sed -i '2i hello,world\nhow are u' 文件名
10.1读取ifconfig中的第二行ip地址
ifconfig |sed -n '2s#^.*inet##gp'|sed -n 's#netm.*$##gp' # '##'表示替换为空,然后输出剩下的字符
10.2
ifconfig -ne '2s#^.*inet##gp' -ne 's#netm.*$##gp'
10.3
ifconfig |sed -rn '2s#^.*inet (.*) netm.*$#\1#gp' # \r表示支持扩展的正则表达式
awk*****:Linux最强大的文本处理工具
awk常用功能
| 序号 |
awk命令常用参数 |
简要例子说明 |
| 1 |
指定分隔符显示某几列 |
awk -F "GET|HTTP" '{print $2}' access.log直接获取显示出日志文件的url这一列 |
| 2 |
通过正则表达式取出想要获取的内容 |
awk ' 11}' /var/log/secure分析生产环境中的日志找出谁在破解用户密码 |
| 3 |
显示某个范围内的内容 |
awk 'NR==20,NR==30' filename显示文件的20到30行 |
| 4 |
通过awk进行统计计算 |
awk '{sum+=$0}END{print sum}' ett.txt进行总计算(高级功能) |
| 5 |
awk数组计算与去重 |
awk '{array[$1]++}END{for (key in array) print key,array[key]}' access.log 对日志进行统计与计数(高级功能) |
awk命令的参数
| 参数选项 |
解释说明 |
| -F |
指定字符分隔符 |
| -v |
定义或修改一个awk内部的变量 |
awk常见变量及属性
| 变量名 |
属性 |
| $0 |
当前整行记录 |
| $n |
当前记录的第n个列,字段间由FS或-F参数指定分隔符 |
| NF |
当前记录中列的个数,也就是包含多少列 |
| $(NF-n) |
倒数第n+1列,n为数字 |
| NR |
已经读出的记录数,也就是行号,从1开始 |
1.1 取test.txt文件的第2行和第3行的内容
awk "NR==2,NR==3" test.txt
1.2
awk "NR>1&&NR<4" test.txt
2. 过滤出含有root字符串的行
awk '/root/' test.txt
3.删除含有root字符串的行
awk '/^[^root]/' test.txt
4.取文件的第一列、第三列和最后一列的内容,并打印行号
awk -F ":" '{print NR,$1,$3,$NF}' test.txt
5.取出linux中执行ifconfig的对应ip地址
ifconfig|awk 'NR==2{print $2}' # CentOS7
ifconfig|awk -F "[: ]+" 'NR==2{print $4}' # CentOS6
ifconfig|awk -F "(addr:)| (Bcast:)" 'NR==2{print$2}' # CentOS6 以括号中的内容做分隔,|表示匹配左边或右边.即将左边"addr:"或右边" Bcast"做分隔符
6.过滤文件中第一列的内容所匹配的root字符串,将符合条件的最后一列输出
awk -F ":" '/root/ {print $NF}' test.txt