命令指南
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