命令指南1

命令指南

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覆盖文件不提示的是否覆盖的几种方法

  1. which cp --> usr/bin/cp file1.txt file2.txt 使用cp命令的绝对路径屏蔽别名
  2. \cp file1.txt file2.txt 使用'\'屏蔽别名
  3. alias取消别名 unalias cp 系统重启失效
  4. 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分为三种模式:普通模式、编辑模式、命令模式,作用分别如下:

  1. 普通模式:用vim命令打开文件后,默认的状态就是普通模式.在这个模式中,不能进行编辑输入操作,但可以按"上下左右"键来移动光标,同时还可以执行一些操作命令进行如删除、赋值、粘贴等工作.
  2. 编辑模式:在普通模式下不能进行编辑输入模式,只有按下"i,I,o,O,a,A,r,R,s,S"(其中"i"最常用)等字幕进入编辑模式后才可以执行录入文字等编辑操作.确定文件是否处于编辑模式状态有一个重要特征,那就是在窗口的左下角要有插入的标记 "-- INSERT --"或"-- 插入 --"
  3. 命令模式:在普通模式下,输入":"或"/"或"?"时,光标会自动定位在那一行,在这个模式中可以执行保存、退出、搜索、替换、显示行号等相关操作
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磁盘存储数据的描述

  1. 磁盘要存储数据,相当于盖房子住人
  2. 磁盘要分区才能存储数据
  3. 格式化磁盘,创建文件系统存储数据
  4. 挂载到指定目录(挂载点)存放数据

索引节点详细说明

  • 索引节点(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的特点

  1. Inode特点
    • ext3/ext4文件系统(CentOS5.x/6.x默认的文件系统)下,一个非空文件有且只有一个Inode和至少一个Block
    • Inode节点相同的文件,互为硬链接文件,可以认为是一个文件的不同入口
    • Inode在某一文件系统(分区)内是唯一的
  2. 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

磁盘空间满了故障总结

  1. Block耗尽的情况:500G的磁盘存放400G+200G的视频
    • 使用df -h查看Block使用信息
  2. Inode耗尽的情况:产生了大量的小文件(小于1kb)
    • 使用df -i查看Inode使用信息

硬链接及软链接数

链接的概念

  • 在Linux系统中,链接可分为两种:一种为硬链接(Hard Link),另一种为软链接(Soft Link)或符号链接(Symbolic Link)
  • 默认不带参数的情况下,ln命令创建的链接式硬链接
    • 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)
  • 软链接不仅针对文件,还可以针对目录

软链接与硬链接的区别

  1. 答分类:Linux系统中,链接可分为两种,一种称为硬链接(Hard Link),另一种称为符号链接(Symbolic Link)或软链接(Soft link)
  2. 答概念:硬链接与源文件的Inode节点号相同,而软链接文件则相当于Windows下的快捷方式(Inode节点号与源文件不同)
  3. 答创建:默认不带参数的情况下,ln命令创建的是硬链接,带-s参数创建的是软链接
  4. 答特点:
    • 不能对目录创建硬链接,但可以创建软链接
    • 软链接可以跨文件系统,硬链接不能跨文件系统
    • 删除软链接文件,对源文件以及硬链接文件无任何影响
    • 删除文件的硬链接文件,对源文件及软链接文件无任何影响
    • 删除链接文件的源文件,对硬链接文件无影响,会导致其软链接失效(红底白字闪烁)
    • 同时删除源文件及其硬链接文件,整个文件才会被"真正"删除
  5. 答案例:硬链接用处不多,可以用来对重要文件做快照以防误删,对目录建立软链接在工作中很常用

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 '6~/Failed/{print11}' /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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容