查看文件与目录信息
ls查看文件与目录信息(list)
ls [选项] [文件或目录]
- 如果不指定文件或目录名,操作对象为当前目录,默认情况下,命令会列出该目录中文件的文件名,且会省略以.开头的文件,列出的文件默认按文件名a-z排序
- -a (all)显示所有文件,包括隐藏文件(以.开头的文件)以及.(表示当前目录)和..(表示上一级目录)
- -A (almost-all)显示所有文件,包括以.开头的文件,但忽略.和..
- -B (ignore-backups)列出文件信息时,忽略以~结尾的文件,这类文件通常是备份文件
- -l (long)显示详细信息,默认情况下ls命令只显示当前目录包含文件的文件名,该选项会详细显示文件所有信息,但文件大小只以byte形式显示,命令可以直接简写为 ll
- -d (directory)查看当前目录信息而非展示目录所含文件
- -h (human-readable)常与l参数一起使用,文件大小会被换算为KB、MB等人类方便读的单位,但该选项会将文件大小四舍五入输出,如:2000bytes输出为2k(2048bytes),1536bytes输出为1.5k,需要准确字节数应当使用-l选项或其他命令(stat、du等)
- -H 在查看链接文件时,显示链接的原文件信息而不是链接文件本身的信息
- -I 模式:忽略与模式相匹配文件名的信息,这里的模式指shell支持的模式,而非所有正则表达式语法,如:ls -I ‘.[^.]’ 表示忽略所有以.号开头,文件名长度为2个字符的文件
- -i (iNode)查看文件i节点,并打印于最左侧
- -F (classify)对不同文件进行特殊标识,该标识会添加于文件名后,/表示目录,*表示可执行文件,@表示链接文件,|表示管道文件,=表示套接字文件,普通文件不添加任何标识
- --time-style=’+时间格式’:按指定格式输出文件的时间信息,时间格式参考date命令
- -R (recursive)递归显示,列出目录下的子目录和子文件,输出较长
- -c 显示文件元信息(文件权限、所有者、硬链接等)最后被修改的时间,需要搭配-l使用,默认情况下,ls -l命令显示的时间是文件内容最后被修改的时间,-c选项会将该时间替换为文件元信息最后被修改的时间
- -u (use) 需要搭配-l使用,类似于-c,将时间替换为文件最后被访问的时间(但许多文件系统为了优化性能,只会在某些情况下更新文件最后访问时间atime,以减少对磁盘的写入,因此默认情况下文件系统很少记录atime,该选项输出信息可能是错误的)
- --time=birth 打印文件的创建时间,需要搭配-l使用,类似于-u,该时间可能不会被记录
- -t (time)按文件最后被修改时间(默认)顺序排序,最新的在前,如果命令有-c、-u、--time=birth选项,则排序依据修改为对应的记录
- -S (size)按文件大小排序,大的排前
- -U 不进行任何排序,按文件在目录中的存放顺序列出文件,如果目录中有大量文件,ls默认按文件名排序时可能消耗时间,该选项可以加快命令执行
- --sort=width 按文件名长短排序,短的排前
- -X 按文件的扩展名(最后一个.号之后的字符视为扩展名)排序
- -r (reverse)反向排序,以上排序相关的输出信息都可以用该选项反序输出
ls命令还可以搭配一些正则表达式只显示自己想看的文件信息
ls命令的输出信息
使用ls -l等命令列出文件详细信息,文件信息格式类似于
字段一
第1位
第1位表示文件类型
- -为普通文件
- b为块设备文件,如:硬盘、光盘等(Block Device)
- c为字符设备文件,如:鼠标、键盘设备文件(Character Device)
- C为连续存储文件,支持高性能读写
- d为目录
- D为门文件,一种特殊的进程通信机制,Linux中不常见,常见于Solaris系统
- l为链接文件
- M为已离线迁移的文件,表示文件已经被迁移到离线存储(如磁盘),如果需要访问需要恢复到在线存储,该文件类型常见于超级计算机
- n为特殊的网络文件
- s为套接字文件,一般用于数据连接,常见于 /var/run目录
- p为管道文件(FIFO),用于进程间通讯
- s为套接字文件(Socket)
- ?其他类型的文件
第2-10位
3位为一组,分别为文件所有者、所属组、其他用户的读、写、执行权限
- r为可读
- w为可写
- x为可执行
- -为无权限
权限除了可以使用rwx表示,在chmod等命令中还可以用权限值来表示:当用户拥有rwx权限时,表示为二进制的111,换算为十进制,其权值为7,当用户拥有r-x权限时,表示为101,权值为5,以此类推,巧妙使用二进制和十进制的转换来更简洁地表示权限
第11位 .号
.号为安装有SElinux的系统特有,这个点表示该文件带有“SELinux的安全上下文”
其他字段
之后的字段分别表示
- 该文件的硬链接总数
- 文件所属用户
- 文件所属组
- 文件大小
- 文件最后一次修改时间,无修改则为创建时间
- 文件名
stat查看文件与文件系统状态
stat命令以另外一种方式显示文件的详细信息,输出内容包含大小、权限、时间戳、inode 号等,并且可用自定义这些信息的输出样式,此外,它还可以用来查看文件所属文件系统的状态。
stat [选项] 文件名1 文件名2…
- 默认情况下,命令会输出文件的信息,如果文件是链接文件,默认输出链接文件本身的信息
- -f 输出文件所属文件系统的状态,而非文件本身信息
- -L 输出链接文件所指向的文件的状态,而不是符号链接文件本身的状态
- -t 以简洁形式在一行上打印信息,方便其他程序解析。在不同版本的GNU coreutils包中,该选项的输出可能不同,可能输出文件名、文件大小(字节)、文件占用块数、文件权限(八进制或十六进制)、设备主编号、设备次编号、十六进制设备号、Inode编号、硬链接数、文件所有者UID、文件所属组GID、最近访问时间戳atime、最近修改时间戳mtime、最近文件属性修改时间戳ctime、文件创建的时间戳btime、IO块大小等
- -c “格式字符串”:按照指定格式显示信息,末尾会自动添加换行,因此如果指定多个文件,则会输出多行信息
- --printf=”格式字符串”:按照指定格式显示信息,且不自动添加换行符
格式字符串支持以下字符:
| 格式字符 | 说明 |
|---|---|
| %a | 八进制形式显示的文件权限 |
| %A | 文本形式显示的文件权限(如 -rw-r–r–) |
| %s | 文件大小(以字节为单位) |
| %n | 文件名 |
| %N | 文件名,如果是符号链接,则显示指向的文件 |
| %F | 文件类型(如 “regular file”、”directory” 等) |
| %u | 文件所有者的用户ID |
| %g | 文件所有者的组ID |
| %y | 最后修改时间 |
| %z | 文件状态最后更改时间 |
Linux系统可能挂载了多个文件系统(例如,根文件系统 /、用户主目录 /home、临时文件系统 /tmp 等),而每个文件系统可能具有不同的属性和状态。stat支持通过-f选项确定文件所属的文件系统,从而提供与该文件系统相关的信息
dir与vdir列出目录信息
这两个命令的功能囊括在了ls命令中,选项和ls命令相似,但ls命令功能更为强大,因此这两个命令极少使用
dir [选项] [目录名]简要列出目录内容,等价于 ls -C -b
vdir [选项] [目录名]详细列出目录内容,等价于 ls -l -b
dircolors设置ls命令的打印样式
在使用ls、dir等命令输出文件和目录详细信息时,可以将不同类型的文件用不同的颜色进行标识,这些样式被定义于LS_COLORS环境变量中,在打印文件类型、权限等属性时,shell会根据此变量中的规则为输出着色。dircolors命令可以用来读取
LS_COLORS变量当前的系统默认配置,也可以用来生成修改LS_COLORS环境变量的配置字符串。默认情况下,LS_COLORS的值内置于shell中,部分Linux发行版可能会将配置写于/etc/DIR_COLORS文件中,用户也可以自定义输出样式,写于~/.dircolors文件中,然后通过dircolors程序解析该配置文件,dircolors程序会更新LS_COLORS变量的值,用户可以在.bashrc中载入该文件,使其在启动shell时生效
dircolors [选项] [文件名]
- -b (默认值)输出Bourne shell格式的代码,代码包括LS_COLORS变量的值和export LS_COLORS语句,用户可以在修改LS_COLORS变量值后将该输出写入.bashrc或.bash_profile文件中
- 输出 C shell 格式的代码,用于 .cshrc 中
- 如果指定了文件,dircolors命令会读取该文件并将其解析为LS_COLORS变量值
- -p 输出当前的样式配置,这些配置会输出为方便阅读和修改的格式,通常需要通过dircolors程序解析为LS_COLORS变量值,才能使用
- --print-ls-colors 将LS_COLORS变量的每个颜色设置都打印在单独的行上,并且该行会输出为对应的颜色,方便即时查看当前的颜色设置
目录操作
mkdir创建目录(make directory)
mkdir [参数] 目录名
- 可以指定多个目录名来同时创建多个目录
- -p 递归创建目录,可以在不存在的目录下创建新目录
- -m 权限:创建目录同时指定目录的权限,接收的参数支持权限的八进制值表示形式(如755),也支持符号模式(如:移除组的写权限g-w)
- -v 每创建一个目录,打印一条消息
cd切换目录(change directory)
cd 目录名
- 目录名可以用 Tab键 补全
- . 表示当前目录,因此cd .不会改变当前目录,cd ./dir则会进入当前目录下的dir目录中,等价于cd dir
- .. 表示上一级目录,可以使用cd .. 返回上一级目录,必要时可以使用多个双点符来向上切换多层目录
- cd -会返回上一个工作目录,这个值被保存在OLDPWD环境变量中
pwd查看当前路径(print working directory)
pwd [选项]
- -L (默认)输出当前路径(PWD环境变量中存储的值),该路径中可能存在符号链接
- -P 输出实际的物理路径,不含任何符号链接,符号链接会被替换为其所指向源文件的路径
rmdir删除空目录(remove empty directory)
rmdir [选项] 目录名1 目录名2..
- 只能用于删除空目录,系统不允许使用该命令删除有内容的目录
- --ignore-fail-on-non-empty 忽略每次删除非空目录时的失败信息,常用于删除多个目录或递归删除时,避免因为尝试删除某个非空目录失败而命令退出
- -p 递归删除目录,如:rmdir -p a/b/c 会依次删除目录c、目录b、目录a,但如果其中一个目录非空,会导致命令失败退出,因此通常搭配--ignore-fail-on-non-empty选项
- -v 每成功删除一个目录就打印其消息
文件操作
touch创建空文件
该命令原本是用来修改文件的访问或修改时间戳的,当指定的文件不存在时,命令会创建一个空文件
touch 文件名1 文件名2…
- 默认情况下,命令会将文件最后一次访问时间(atime)和修改时间(mtime)更改为当前时间,如果文件不存在,则会新建一个空文件
- 如果文件名中有空格符,需要使用””
- -c 如果文件不存在,不新建文件,也不进行警告
- -a 仅更改文件最后一次被访问的时间(atime)
- -m 仅更改文件最后一次被修改的时间(mtime)
- -d 时间:将文件的atime和ctime更改为指定时间,而不是当前时间,该选项接受的时间格式很多,参考date命令,如:-d ‘2021-07-10 14:20:59 +0800’
- -t [[cc]yy]mmddhhmm[.ss]:将文件的atime和ctime更改为指定时间,该选项的格式要求较为严格,要按照指定格式书写
- -h 修改链接文件的时间戳
- -r 文件:使用该文件的atime和ctime作为更改的数据来源,该选项可以搭配-d选项,如:-r old.txt -s ‘-60 seconds’表示以old.txt文件的atime和mtime为原点,比该时间早60秒作为指定文件的atime和mtime
查看文件
cat查看短文件内容
cat [选项] [文件名]
- -n 显示行号(从1开始),包括空白行
- -b 空白行行不显示行号,只为有文本的行添加行号(从1开始)
- -s 删除连续的多个空白行,只显示一行空白行
- -T 使用^T替换所有制表符
从头到尾正常显示文件
tac反向查看短文件内容
tac [选项] [文件名]
cat反写,从尾到头显示文件(文件末行为第一行)
- -s “分隔符”:指定分隔符,默认是换行符
- -b 将分隔符添加到记录开头
- -r 将分隔符字符串识别为正则表达式
more查看长文件内容
该命令来源于util-linux软件包
more [文件名]
分页显示文件,一般用于查看长文件
- 空格或f 向下翻页
- b 向上翻页
- Enter 换行
- q或Q 退出
less [文件名]
该命令来源于less软件包,其命令名来源于”less is more”,因此也比more提供了更多高级功能,如使用上下箭头翻页,它同样会分页显示文件,一般用于查看长文件,支持关键字搜索
- 空格或f或PageDown 向下翻页
- b或PageUp 向上翻页
- 上下方向键 逐行翻动
- 可以使用 /关键字 进行关键字搜索,使用 n 跳转到下一个高亮显示的关键字
- q或Q 退出
head&tail仅查看前几行或后几行
head [选项] 文件1 文件2….查看文件前几行内容
- 默认显示前10行
- 如果指定多个文件,在输出每个文件内容前会以==>文件名<==形式输出文件名
- -c [-]num:显示前num个字节,如果num值前添加了-,则输出每个文件除了最后num个字节以外的所有内容,可以使用K(KiB)、KB、MB、GB、GiB等单位
- -n [-]num:显示前num行内容,如果num值前添加了-,则输出每个文件除了最后num行以外的所有行
- -q 不打印文件名
- -z 一些二进制文件或特殊文本文件会以空格作为数据分隔符,该选项用于处理这类文件时,以空格作为字段分隔符(默认是以换行符作为分隔符),如head -z -n 2会输出文件的前两个以空格分隔的字段,而不是前两行
tail [选项] 文件名
- -n 行号:仅仅查看文件末几行,不使用 -n 指定行号,默认显示后10行
- -c 字节数:查看文件最后几个字节
- -f 动态显示文件末尾,常用于查看日志文件实时变更(--follow)
- -q 不输出文件名
nl显示行号与内容(number line)
nl [选项] [文件名]
用于给文本文件内容添加行号并输出到屏幕,如果不指定文件名,nl命令会从标准输入读取内容
- -b 样式:指定行号的样式(--body-numbering=style),样式支持以下值:
- a 对所有行编号
- t 只对非空行进行编号
- n 不对行进行编号
- -w 值:指定行号的宽度,默认为6位
- -i 值:设置行号的递增值,可以为负数,默认为1
- -l 值:将连续的空行视为一个空行,并只对最后一个空行添加行号,如果连续空行的数量少于该值,则不进行编号(这里的空行指不含任意字符的行,甚至不包括空格、制表符的行)
- -n 格式:指定行号的格式(--number-format=format),格式支持以下值,默认为rn:
- ln 左对齐,无前导0
- rn 右对齐,无前导0
- rz 右对齐,有前导零
- -s 字符串:指定一个字符串添加到行号与文本行之间(默认为tab)
常用组合选项: - -bt:对非空的文本行进行标号,包含注释行(仅限于使用#号注释的行,一些编程语言里的注释方式不会被识别),空行除外(默认)
- -ba:对所有行都进行标号
- -bn:不标出行号,但文本左侧仍会为行号预留空格
- -nln:行号左对齐,无前导0
- -nrn:行号右对齐,无前导0(默认)
- -nrz:行号右对齐,有前导0
3 CCCC (2) nl -ba data.txt 会为包括空白行在内的行标出行号 1 AAAA 2 BBBB 3 4 CCCC (3) nl -nln data.txt 行号会左对齐,无前导0 1 AAAAA 2 BBBBB
3 CCCCC (4)nl -nrn data.txt 行号会右对齐,无前导0 1 AAAAA 2 BBBBB
3 CCCCC (5)nl -nrz data.txt 行号右对齐,行号前会补0 000001 AAAAA 000002 BBBBB
000003 CCCCC (6)nl -ba -i2 data.txt 1 AAAAA 3 BBBBB 5 7 CCCCC
rm删除文件与目录(remove)
rm [选项] 文件或目录名
- 默认情况下,命令不会删除目录,可以指定多个文件同时删除
- -d 如果指定的目录是空目录,则删除
- -r 删除目录,该选项会递归删除指定的目录及其目录中的内容
- -i 询问用户是否删除
- -f 强制删除,不再询问用户确认,且如果指定了删除不存在的文件,也不会提示用户
- -I 如果使用-r选项,或者删除3个以上文件时,询问用户是否继续执行该命令
- -v 在删除每个文件前打印其文件名
- --one-file-system 只删除当前(所指定文件名)文件系统中的内容,该选项用于当使用-r选项进行递归删除时,避免意外删除另一文件系统的内容
shred覆盖与删除文件
通过rm命令删除的磁盘文件通常可以通过一些技术手段进行恢复,当需要完全删除文件时,可以使用shred命令,该命令会对删除的文件区域进行重写覆盖,以防止数据恢复。
该命令在一些文件系统中效果可能有限,由于SSD使用了不同的数据存储和垃圾回收机制,该命令在固态硬盘中可能无效
shred [选项] [文件名]
- 默认情况下,命令会使用系统随机生成的数据覆盖文件,默认会覆盖3次,覆盖完默认不删除
- -n 值:指定覆盖的次数,默认为3
- -u 覆盖后删除文件
- -z 在进行最后一次覆盖时,使用数据0填充文件,这样文件在删除前看起来像是空的而不是随机数据,可以一定程度隐藏覆盖操作
- -v 打印覆盖的详细操作,如覆盖的进度
- --random-source=文件:从指定文件读取随机字节进行覆盖,默认从Linux内核获取随机数据
- -s 值:粉碎文件的前指定个字节,默认会粉碎整个文件,可以使用k、M等单位
unlink删除文件
这是系统提供的unlink函数的最小接口,功能和rm命令一样,比较简洁,通常用于C语言等程序
unlink 文件名
- 一次只能删除一个文件,没有功能性选项
- 在某些系统中(如:GNU系统),该命令只能删除文件而不能删除目录
cp复制文件或目录(copy)
cp [选项] [源文件或目录] [目标文件或目录]
- 注意!默认情况下,如果cp命令指定目标文件名,而该路径下已经有一个同名文件,则原本存在的文件会被cp命令覆盖
- 复制时可以同时指定多个源文件,此时最后一个参数”目标文件”需要指定一个已经存在的目录,cp命令不会自行创建目录
- -r或-R 递归复制目录,如果目录下有链接文件,则默认只复制链接文件本身
- -p 保留文件属性,如文件修改时间、文件所有者、权限等
- -a 归档模式,尽可能多地保留原有的文件结构和属性,等价于-dpr
- -i 需要覆盖已有文件前询问用户
- -f 强制覆盖文件,即使目标文件是只读的,它也会尝试删除后再复制
- -b 覆盖已有文件前先备份该已有文件,默认以~作为后缀名,备份方式参考Linux命令的通用备份方案
- -S “字符串”:通常与-b选项搭配使用,备份文件时使用指定的字符串作为文件后缀名
- -n 不覆盖已存在的文件
- -u 只在原文件比目标文件更新,或目标文件不存在时复制文件
- -v 详细模式,详细输出每个复制的文件或目录名
- 复制单个链接文件时,命令默认会将链接指向的源文件内容复制到目标文件中,而不会去复制链接文件本身。如果链接文件已经失效(未找到它的源文件),cp命令会直接报错以避免安全风险。
- 在使用-r或-a进行递归复制时,cp命令只会复制链接文件本身,而不会复制链接文件的源文件内容
- -d 将链接文件复制为符号链接文件,而不是复制源文件的内容
- -H 链接文件名:在使用-r或-a进行递归复制时,复制该链接文件的源文件内容
- -l 为文件创建硬链接,相较于ln命令,该选项会保留文件的属性(如时间戳和权限)
- -L 复制链接文件时,复制链接指向的目标文件,而不是符号链接本身
- -p [值]:保留文件的指定属性,该选项的取值可以是:mode(保留与访问权限相关的属性)、ownership(保留所有者和组,需要为该组成员才有权限)、timestamps(尽可能保留上次访问和上次修改的时间)、links(在目标文件中保留源文件的所有链接)、context(保留文件的 SELinux 安全上下文)、xattr(保留文件的扩展属性)、all(保留所有)
dd按指定块大小复制和处理文件
dd命令支持按块大小读取和写入数据,并支持格式转换,适合从U盘等设备按块读取数据复制到指定位置,如:将整个分区复制到U盘或者从U盘备份(虽然dd支持该功能,但文件备份通常使用一些专用的备份脚本)
dd 参数
- 该命令选项较少,通常使用参数修改命令的行为
- if=文件路径:指定输入文件路径,默认从stdin读取
- of=文件路径:指定输出位置,默认输出到stdout
- ibs=值:设置每次输入的块大小,默认为512bytes
- obs=值:设置每次输出的块大小,默认为512bytes
- bs=值:指定每次输入和输出的块大小,这会覆盖ibs和obs的值
- count=值:指定块数量
- status=值:指定输出状态,可以取值:progress(持续显示传输进度),noxfer(不显示传输完毕后的最终统计数据),none(只输出错误信息,屏蔽其他信息)
- iflag=值:按照指定要求访问输入文件,可取值参考oflag的取值
- oflag=值:按照指定要求访问输出文件,值可以为:
- append 以附加形似写入文件,这样即使其他进程正在写入此文件,dd 命令也会将其附加到文件的当前内容,只对oflag有效
- direct 通过I/O直接读取或写入数据,而不使用缓冲区
- noatime 不更新文件的访问时间戳
更多标志参考GNU文档
install复制程序文件
install用来将文件(通常是程序文件)复制到指定位置,并且可以在复制时指定文件的权限、所有者等属性,该命令通常用来在Makefile中将程序复制到其目标目录中
install [选项] [源文件] [目标文件]
- -b 复制时如果目标文件已存在,则覆盖,覆盖前进行备份
- -S “字符串”:备份时指定文件后缀名
- -C 比较源文件和目标文件的内容,如果目标内容、所有者、组、权限和SELinux上下文没有变化,不进行复制,否则复制文件
- -g 组ID或组名:设置已安装文件或目录的所属组,默认为当前组
- -o 用户ID或用户名:设置已安装文件或目录的所有者,默认为root用户
- -m 值:设置文件权限,选项接收的值支持权限的八进制值表示形式(如755),也支持符号模式(如:所有者增加执行权限u+x,移除组的写权限g-w)
- -v 详细模式,详细输出每个复制的文件或目录名
- --preserve-context 保留文件和目录的SELinux安全上下文
- -p 设置文件的最后被访问时间和最后被修改的时间,如果不使用该选项,则这两个时间默认为程序文件的安装时间
mv移动文件与重命名(move)
mv 原文件或目录 目标文件或目录
- 注意!如果指定的目标文件路径下已经有同名文件,mv命令默认会直接覆盖该文件,源文件或目录可以有多个来同时移动多个文件
- -b 如果目标文件已存在,则进行备份
- -S “字符串”:指定备份文件的后缀名
- -f 目标文件存在时,直接覆盖,不询问用户
- -i 目标文件存在时,覆盖前询问用户
- -n 目标文件存在时,不覆盖已经存在的文件,视为操作失败
- -u 仅当目标文件比已有文件新(做了改动),或目标文件不存在时移动文件
- --exchange 交换原目录和目标目录中的文件(GNU拓展)
- -v 移动文件前打印每个文件的名字
以指定格式打开文件
od以指定进制打开文件(octal dump)
该命令用于查看二进制文件或文本文件的十六进制、八进制、ASCII等数据表示形式,可以直观地查看文件的非打印字符或二进制内容,以及文件内容在文件中的地址
od [选项] 文件名
- -A 进制:指定文件地址的进制表示形式,可以取以下值:
- n 不显示地址
- o 以八进制显示地址(默认)
- x 以十六进制显示地址
- d 以十进制显示地址
- a 以字母方式显示地址
- -t 格式:指定文件内容的输出格式,可以取以下值:
- o 以八进制格式显示
- x 以十六进制格式显示
- d 以十进制格式显示
- c 以字符方式显示
- f 以浮点数格式显示
- -N 长度length:显示文件的前length个字节的数据,可以使用MB、GB、KiB、GiB等单位指定字节数
- -j 长度skip:跳过文件的前skip个字节,从此处开始显示数据,可以使用MB、GB、KiB、GiB等单位指定字节数
- -v 显示所有数据,默认压缩相同的连续行为一行
base64解码与编码文件
将从文件或标准输入读取的数据转换为 base64 编码形式,可以用来将二进制数据转换为可打印的文本数据
base32 [选项] [文件名]
base64 [选项] [文件名]
- -d 解码数据,不使用该选项为编码数据(--decode)
- -w 值:指定每行输出字符数,达到该长度后换行,默认值为76,值为0则表示不换行(--wrap=number)
- -i 解码时忽略换行符和无法识别的字节,而尝试尽可能解码剩余的字节,数据包在网络中传输时,可能会被分割和损坏,该选项会忽略数据分割形成的换行符和传输损坏的数据
basenc多格式解码与编码文件
basenc是一个较新的命令,可能在部分旧的GNU Coreutils包中没有包含该命令,该命令相较于base64支持更多的编码和解码格式
basenc [选项] [文件名]
- -d(解码)、-w、-i选项和base64命令相同
- --base64:使用 Base64 编码或解码数据
- --base32:使用 Base32 编码或解码数据
- --base16:使用 Base16(十六进制)编码或解码数据
- --base32hex:使用拓展十六进制字母表base32形式进行解码或编码
- --base64url:标准的 Base64 编码中,使用了+和/字符,它们在URLs和某些文件系统中可能有特殊含义,该选项会将+替换为-,将/替换为_,去除编码末尾的填充字符=,以此编码或解码为文件和 URL 安全的 base64 格式
- --z85:使用 Z85 编码或解码数据,编码时输入长度必须是 4的倍数;解码时,输入长度必须是5的倍数
- --base2lsbf:编码为二进制形式,每个字节的最低有效位在前
- --base2msbf:编码为二进制字符串形式,每个字节的最高有效位在前
格式化输出内容
fmt格式化行(format)
fmt命令用来将文件内容按指定的宽度输出,它会拆分太长的句子,并根据选项决定是否保留其原有格式。该命令只能用来格式化处理ASCII文本,无法格式化处理中文等文本。
fmt [选项] 文件名
- 默认情况下,该命令每行输出的长度为75个字符(包含换行,因此实际输出长度为74)
- -w 长度:指定每行文本的字符长度,该值将包含换行符,实际输出的文本字符为指定的值-1
- -s 只拆分长行,而不将短行合并到一起以达到每行输出指定字符的要求,默认情况下会合并短行
- -c 保留每行的缩进格式,如:原文件首行缩进2字符,该选项会保留这个缩进
- -t 在处理带有标签或行号等段落时,保留这些行的缩进等格式
- -u 文本中包含多个连续空格符时,删减到只保留一个空格符
- -p “字符”:仅格式化以该字符开头的行,如:-p “#”将只格式化以#开头的行(如:注释行)
pr文件分页与打印(print)
pr 命令用于将单个或多个文件格式化为打印机打印格式,它可以将文件分成页,并支持添加页眉、页脚功能
pr [选项] 文件名
- -l 行数:指定每一页的行数,默认值为66行,如果一页不满足66行,则会填充空白行
- -w 宽度:指定每行的字符数,默认值为72个字符,
- -d 双倍行距输出,这会在每行之间插入一个空行,更容易阅读
- -h “页眉字符串”:设置页眉,默认情况下,pr命令会在每页顶部显示文件名和日期
- -o 缩进数:指定每行的缩进空格数
- -n 为每行添加行号
- -m 并列显示多个文件的内容。如果提供了多个文件,此选项可以将它们的内容并列显示在同一页上
- -t 禁用页眉和页脚输出
- -F 在每页末尾添加换页符,适用于需要在打印时进行分页的情况
fold强制文本行换行
fold命令用于强制限制每行文本的输出长度,将文件的每一行按指定宽度分割为多行,相较于fmt命令,fold命令只会强制在固定宽度处换行,不会对文本内容进行任何重新排列或合并
fold [选项] [文件名]
- -w 值:指定每行文本的字符数,默认值为80个字符
- -s 在空白字符处分割行,而不是在固定宽度处强制换行。这会让文本在自然的空格处换行,而不破坏单词
- -b 值:指定每行文本的字节数,该选项按照字节数分割文本行,可用于处理多字节字符(如中文),可以使用MB、GB、KiB、GiB等单位
split文件拆分
split命令用于将文件分割成多个较小的文件,它可以按指定的字节数、行数或其他标准来分割文件,非常适合处理大型数据文件或将文件分割成适合传输的小块,尤其是在需要将其传输至大小受限的环境中时
split [选项] 文件名 [新文件名前缀]
- 默认情况下,该命令会为每个文件写入最多1000行文本,默认输出的文件名为xaa,xab…..
- 如果指定了新文件名前缀newfile_,输出的文件名为newfile_xaa…
- -n 数量:将文件拆分为5个部分
- -b 字节数:按指定的字节数拆分文件,该选项不考虑行的完整性,可能会将同一行内容拆分到两个文件中
- -C 字节数:按指定的字节数拆分文件,该选项不会拆分行,它会在文件达到指定大小时,寻找下一个换行符进行分割,从而确保每一行都完整保留在同一个文件中
- -l 行数:按指定的行数拆分文件
- -d:使用数字作为输出文件的后缀,如x00,x01….
- -a 值:指定输出文件的后缀长度,如:-a 4表示输出文件名为xaaaa,xaaab…,默认值为2
- --additional-suffix=字符串:为文件名添加后缀
- --numeric-suffixes=值:指定文件的数字后缀从该值开始
csplit按内容拆分文件
csplit是一个用于按特定模式或位置分割文件的命令,与split不同,csplit可以根据正则表达式模式匹配或指定行号将文件拆分为多个部分,适合处理需要基于内容分割的场景
csplit [选项] 文件名 ‘正则表达式/PATTERN/或行数n’ ‘{重复次数}’
- 默认情况下,命令会在内容写入文件后打印该文件的大小(字节数)
- 如果指定正则表达式,命令会在匹配处分割文件,并且匹配的这一行会写入下一个文件。如果还指定了重复次数,则会继续查找下一次匹配的内容,默认只匹配一次
- 如果指定的是行的数量,则从数量对应的该行处分割文件,并且该行写入下一个文件。如果指定重复次数,也会继续进行分割
- 分割后生成的文件名默认为xx00,xx01,xx02…..
- -f 字符串:指定生成的文件名前缀,默认是xx
- -b 格式字符串:指定生成文件名的后缀,默认为%02d(两位数字)
- -n 值:指定生成文件名后缀中的数字位数,默认为2
- -k 遇到错误,不要删除输出文件
- -z 删除大小为 0 的输出文件
- -s或-q:不打印每个文件大小
合并文件
paste合并文件
paste [选项] [文件名1] [文件名2]…
- 默认情况下,如果命令只指定一个文件,paste会原样输出文件;如果指定多个文件,该命令会将多个文件的第一行都粘贴到第一行,第二行都粘贴到第二行,依此类推,同一行内容之间使用tab分隔
- -s 如果只指定一个文件,命令会将该文件的所有内容合并到同一行上,以tab分隔。如果指定多个文件,命令会将文件1的内容都粘贴到第一行,文件2内容粘贴到第二行,其他文件以此类推
- -d “字符1字符2..”:使用指定的字符作为内容分隔符,默认为tab,可以指定多个字符,这些字符会循环使用,文件合并后的内容将写为:文件1字符1文件2字符2
- paste - - - paste命令的特殊用法,允许命令从标准输入中将每n行合并为1行,n取决于-的数量,每个-间有空格
join 按字段合并文件
以某个字段作为合并依据,合并两个文件的内容,默认是按第一个字段进行匹配,通常会先使用 sort 对文件进行排序再进行合并
join [选项] 文件1 文件2
- 默认情况下,命令会比较两个文件中的第一个字段的内容,如果两个文件第一个字段内容相同,则合并输出该行的剩余部分,输出默认使用空格分隔
- -1 字段号:修改文件1作为匹配依据的字段,默认是第一个字段
- -2 字段号:修改文件2作为匹配依据的字段,默认是第一个字段
- -j 字段号N:等价于-1 N -2 N
- -o 字段号:指定输出哪些字段,0代表整行
- -t 分隔符:指定字段分隔符,默认为空格
- -i 比较时忽略大小写
- -a 1或-a 2:输出文件1或文件2中未匹配到的行
- -e “字符串”:指定在某个字段缺失时,用哪个字符串代替
- -v 1或-v 2:仅显示文件1或文件2中未匹配的行
- --check-order:如果任一输入文件排序错误,则失败并显示错误消息
- --nocheck-order:不检查两个输入文件是否按排序顺序排列(默认)
- --header:将输入文件的第一行视为标题行,并合并打印到第一行
comm逐行比较两个排序好的文件
comm [选项] 文件1 文件2
- 默认情况下,命令会生成三列输出,第一列为文件1独有的行,第二列为文件2独有的行,第三列为文件1和文件2共有的行
- -1或-2或-3选项,可以禁止打印对应的列
- --check-order 检查输入的文本行是否是已经排序过的,如果任一文件排序错误则报错并退出
- --nocheck-order 不检查文件是否排序
- --output-delimiter=”字符串”:替换所输出三列信息之间的分隔字符串,默认为Tab
文件校验
sum计算文件占用的磁盘块数与校验和
sum命令会为每个给定文件计算一个16位校验和(checksum),以及文件占用的块大小,该命令是为了与旧Unix系统兼容而提供的,GNU更推荐使用cksum命令
sum [选项] 文件
- -r 使用BSD算法计算校验和,块大小为1024byte
- -s 使用systemV算法计算校验和,块大小为512byte
cksum计算文件校验和
cksum命令会为每个给定文件计算 32 位循环冗余校验(CRC)校验和,并输出文件字节数,可以用来验证文件在传输或复制过程中是否被损坏或修改
cksum [选项] 文件名
- 命令会默认输出文件的校验和、文件大小(字节数)、文件名三个信息
- 命令默认使用CRC-32 算法,生成32位校验和,输出时通常以十进制形式表示,通常输出10位
- 该命令主要用于检测随机性错误,安全性相较于md5sum、sha256sum 等哈希命令会较低
- -a ‘算法’:使用指定的摘要算法计算校验和,支持sysv,bsd,crc,md5,sha1,sha224,sha256,sha384,sha512,blake2b,sm3等
- -b 以二进制数据形式读取文件
- -c 文件名:从指定文件中读取校验和与文件名(可以包含路径),并检查校验和与文件是否匹配,以下选项需要与-c选项搭配使用:
- --ignore-missing 忽视缺失的文件,在大批量校验文件时,可能会有部分文件缺失,该选项用来禁止在文件缺失时报错
- --quiet 静默模式,只输出校验失败的文件信息,默认情况下,校验成功和经验失败都会输出信息
- --status 只在文件打开失败时输出错误信息
- --strict 严格模式,任意一个文件校验失败,就立即打印错误信息并以非0状态码0退出命令,适合多文件处理时,所有文件都必须校验通过的场景
md5/b2/sha1校验文件
以下为cksum命令各选项的独立版本,他们拥有与cksum相似的选项和参数:
md5sum [选项] [文件名]打印或检查 MD5 摘要
b2sum [选项] [文件名]打印或检查 BLAKE2 摘要
sha1sum [选项] [文件名]打印或检查 SHA-1 摘要
sha224/256/384/512sum [选项] [文件名]打印或检查SHA-2摘要,可以选择几种(224、256、384、512)不同长度的校验和位数
- -t 以文本模式读取文件
- -c 文件名:从指定文件中读取校验和与文件名(可以包含路径),并检查校验和与文件是否匹配,以下选项需要与-c选项搭配使用:
- --ignore-missing 忽视缺失的文件,在大批量校验文件时,可能会有部分文件缺失,该选项用来禁止在文件缺失时报错
- --quiet 静默模式,只输出校验失败的文件信息,默认情况下,校验成功和经验失败都会输出信息
- --status 只在文件打开失败时输出错误信息
- --strict 严格模式,任意一个文件校验失败,就立即打印错误信息并以非0状态码0退出命令,适合多文件处理时,所有文件都必须校验通过的场景
file查看文件类型
file [选项] 文件名查看文件类型
- -i 显示文件的MIME 类型,而不是传统的文件类型描述,如:text/plain; charset=us-ascii
- -b 显示结果去掉文件名,只显示文件信息
file命令会检查文件内容的特征,而不仅仅通过文件扩展名来识别文件的实际类型,这对于处理没有扩展名或扩展名不正确的文件特别有用,命令可以识别文本文件(文本文件还可以识别它的编码格式)、可执行文件、图像文件、压缩文件等多种类型
sync将缓存写入磁盘
立即将内存缓冲区中的所有数据写入磁盘中,该命令常用于:
- 对重要数据进行修改后,立即保存修改到磁盘
- 卸载文件系统(移除U盘等设备)前,确保所有数据写入完毕
- 进行系统更新和维护前,确保数据安全保存完毕
sync [选项] [文件名]
- 如果不指定任何参数和选项,命令会将所有挂载文件系统中内存缓冲区的数据同步到磁盘
- -d 只同步该文件数据,而不刷新文件的元数据(例如文件权限、所有者、时间戳等)
- -f 将包含该文件的整个文件系统同步到磁盘,而不仅仅是该文件的数据部分
truncate扩大或缩小文件大小
truncate 选项 文件1 文件2…
- 默认情况下,如果所指定的文件不存在,将创建该文件,如果未指定-s选项,则新建的文件大小为0字节
- -c 不创建不存在的文件
- -s 值size:将文件大小调整为指定值,默认以字节为单位,值支持使用K/KiB(1024bytes)、KB(1000bytes)等单位,值之前也支持使用以下前缀:
- +在当前文件大小基础上扩大size字节
- -在当前文件大小基础上缩小size字节
- <将文件大小调整到小于该值
- >将文件大小调整到大于该值
- / 将文件大小缩小为size的倍数
- % 将文件大小扩大为size的倍数
- -r 文件名:以该文件大小作为参考值进行修改
- -o 将-s指定size视为文件I/O块数,而不是字节数
该命令用来将文件扩大/缩小到指定大小。如果文件小于指定大小,则命令会使用空字符(\0)填充文件末尾,空字符在文本编辑器中不可见,但文件实际大小会被改变;如果文件大于指定大小,则文件末尾会被截断,多余的数据会丢失。该命令可以用于以下场景:
- 创建大文件用于测试:可以快速创建特定大小的文件,用于测试磁盘写入速度或其他场景。
- 调整日志文件大小:对日志文件进行大小调整时,可以使用 truncate 来截断多余数据。
- 快速清空文件:将文件大小设置为 0 来清空文件内容
处理文件路径
这些命令不会去验证所指定的文件或路径是否存在,只是单纯返回所给定的路径字符串中的某个部分
basename提取文件名
该命令用于从文件路径中删除路径和文件后缀,提取纯净的文件名或目录名,方便使用干净的文件名进行重命名或备份
basename 文件路径 [要删除的文件后缀]
basename [选项] 文件路径
- 默认情况下,命令会去除文件或目录的路径部分
- -a 在指定多个路径时需要使用该选项,该选项会将每个参数视为一个文件路径,而不是要删除的文件后缀
- -s 后缀字符串:指定需要删除的文件后缀,该选项适合第二种命令,GNU版本的basename命令,使用-s选项会默认隐式启用-a选项
- -z 在每行输出末尾输出空字符(null),而不是换行符
dirname提取路径
该命令与basename命令相反,它会获取文件路径而去除文件名
dirname [选项] 文件路径
- 可以同时指定多个路径而不需要任何选项
- 如果指定一个文件而不包含/路径,则返回的路径为.(当前目录)
- -z 在每行输出末尾输出空字符(null),而不是换行符
pathchk检查文件名是否有效
pathchk命令通常用于验证路径名是否符合当前系统的文件命名规则(比如文件名长度限制或字符限制),帮助用户在创建文件或目录之前,或在不同系统之间移动文件之前,检测出潜在的问题,避免因路径名不合法而导致的操作失败。在POSIX标准中,所有路径组件的长度不能超过255个字节,总路径名的长度不能超过4096个字节
pathchk [选项] 文件路径
- 默认情况下,所指定的路径中有任一目录无搜索(x)权限,或文件名长度、文件路径总长度大于系统支持的最大值,命令将返回错误
- 默认情况下,所指定的文件名不存在不视为错误
- -p 满足以下任何条件,打印错误:
- 文件名为空
- 文件路径包含字母、数字以及._-/以外的字符(这几个是POSIX可移植文件名字符)
- 文件名长度、文件路径总长度大于POSIX的可移植性最低限制
- -P 如果文件名为空,或文件路径中的任一目录名或文件名以-开头,则报错
realpath获取绝对路径与相对路径
realpath命令可以用来获取文件的绝对路径、文件之间的相对路径、符号链接所指向目标的真实路径等,通常用来在脚本中标准化路径,避免路径混淆,使脚本更具可移植性和可靠性
realpath [选项] 文件1 文件2…
- 默认情况下,命令会输出所给定文件的绝对路径,如果文件是一个符号链接,则输出其指向源文件的绝对路径
- -e 只解析存在的文件或目录路径,如果所指定的路径中任一文件或目录不存在,立即报错
- -m 如果所指定的路径中有文件或目录不存在,将其视为目录,并返回标准化路径,而不报错
- –relative-to=目录名DIR:输出realpath命令指定的文件1(文件2…)与目录DIR之间的相对路径
- –relative-base=目录名DIR:以该DIR路径作为解析时的基准起始点,如果文件1、文件2…在DIR路径下的子目录中,则输出相对路径,如果文件1、文件2…在DIR目录以外的位置,输出绝对路径
- -s 不解析符号链接
- -P (默认)解析路径中所有的符号链接,返回它们的真实路径(源文件的路径),如:/home/user/link-to-dir/file中link-to-dir是一个符号链接,该选项会找出它所指向的源文件的路径,并替换到要输出的路径中
- -L 不解析父目录中的符号链接,路径中任何中间部分的符号链接将被保留,只有在最终文件或目录是符号链接时解析,如:/home/user/link-to-dir/file中link-to-dir是符号链接,由于它属于父目录,因此该链接文件不会被解析。如果最终目标文件file是符号链接时,则会解析file所指向源文件的路径
- -q 禁止显示错误信息
- -z 在每行输出末尾输出空字符(null),而不是换行符,方便将输出交给其他程序解析
find文件查找
find命令可能占用大量的系统资源,尽量避免在系统使用高峰期频繁使用find查找文件,文件查找范围应该尽可能小
find [起始查找路径] [选项] [选项对应的查找表达式]
- 不指定起始查找路径时,默认从当前目录.开始,起始查找路径可以指定多个,空格分隔
- -files0-from 文件名:(GNU拓展)从该文件中读取起始查找路径而不是从命令行参数,文件中指定多个路径时,必须使用 ASCII NUL字符(\0)分隔,以避免文件名中含有空格、换行符等特殊字符。可以使用-files0-from -表示从标准输入读取查找路径,方便从管道等地方输入查找路径
- 在可以使用通配符(参数标识为pattern)的选项中,通配符必须用引号包裹,防止shell提前扩展通配符(*匹配任意数量字符,一个?匹配一个字符,[]匹配多个表示或的字符)
- 搜索范围应尽可能小,尽量避免在根目录下搜索
find的工作流程:
find 命令会以所指定的查找路径作为起点,递归地执行深度优先遍历(可通过 -maxdepth 或 -mindepth 控制遍历深度),在遍历过程中,find会依次访问路径下的所有文件和子目录(但可以使用 -prune 等选项主动排除特定目录),对于访问到的每个文件或目录,find会按照命令行中的条件表达式从从左到右的顺序,逐一检查其是否满足指定的条件(如:-name检查文件名、-type检查文件类型等,可以使用-and、-or等逻辑运算组合这些条件),当条件满足时,find命令会对匹配的文件执行指定的操作(默认动作是打印该条目的完整路径),如果条件不满足,则跳过该条目,继续处理下一个。
根据文件名查找
- -name “pattern”根据文件名查找
- -iname “pattern”根据文件名查找(不区分大小写,GNU拓展)
- pattern不应该包含任何/以及路径,-name a/b永远不会匹配任何内容,匹配路径应该使用-path或-regex
根据完整路径查找
- -path “pattern” 根据完整路径查找,可以使用通配符
- -ipath “pattern” 根据完整路径查找(不区分大小写,GNU拓展),可以使用通配符
- -regex “正则表达式” 使用正则匹配完整路径,在正则中使用.等符号作为路径或文件后缀名时,需要转义,如:”\.txt”
- -iregex “正则表达式” 使用正则匹配完整路径(不区分大小写,GNU拓展)
- 上述表达式匹配的是完整路径,所以所给定的模式应当能匹配到起始查找路径,find是将模式与查找路径下的每个文件或目录的完整路径进行比较,如果模式不包括起始查找路径将无法匹配到任何结果,如:命令find /a -path “b”中,find会在/a路径下开始遍历,路径至少为/a/…,因此不会匹配到b,表达式b应当包含查找路径部分,如:-path “*/b”或明确指定-path “/a/b”,如果b只是文件名而不包含路径,应该使用-name “b”以匹配文件名
- 完整路径指定的是表达式中需要包含起始路径,但也可以可以包括文件名的模式表示形式,以批量匹配文件,如:-path “*.c”中*既能匹配到路径,也能匹配到文件名
- -regextype 类型:指定正则表达式的解析类型,值可以是:emacs(默认,使用与GNU Emacs兼容的正则表达式),posix-awk(与 POSIX awk命令兼容的正则表达式),posix-basic(基本正则表达式),posix-egrep(与 POSIX egrep 命令兼容的正则表达式),posix-extended(扩展正则表达式)
根据文件类型查找
find [查找路径] -type [文件类型]
文件类型可以是以下值:
- f普通文件
- d目录,当前目录也将作为查找结果返回
- l符号链接文件,使用了-L选项时,由于会追踪链接文件,因此遍历到的文件都是源文件,此时-type l将只能匹配到断开的链接文件
- p 命名管道
- b 块设备(缓冲)文件
- c 字符设备(无缓冲)文件
- s 套间字文件socket
处理符号链接
- -lname “pattern”查找符号链接
- -ilname “pattern”查找符号链接(不区分大小写)
- 以下选项是全局选项,会影响find命令的路径解析方式,必须在查找路径之前指定
- -P不跟随符号链接(默认),不访问其指向的实际目录或文件,直接处理链接本身
- -H只跟随命令行所指定路径中的符号链接,如果后续遍历该路径下的文件时,遇到其他符号链接,将不再跟随
- -L跟随所有符号链接,在遍历搜索路径下的文件时,如果遇到其他符号链接,则追踪其指向。在使用了-L后,-lname和-ilname将不再匹配到任何内容,因为此时所有文件都是源文件而不再有符号链接,-type l将只能匹配到断开的符号链接
xtype根据符号链接的原文件类型判断
xtype是type选项的拓展,主要用于判断符号链接的源文件类型,如果当前所判断文件是非链接文件,该选项行为和type相同。如果是符号链接,则会追踪源文件,以源文件类型作为判断标准
-xtype 文件类型匹配链接文件源文件类型为指定类型的文件
- 支持的文件类型与type选项相同,常用的有f(普通文件),d(目录),l(符号链接文件)
- 注意:若符号链接指向无权限访问的目标,-xtype会判定为无效链接
处理硬链接
- -samefile 文件名:在搜索路径下查找是否有与该文件有相同inode号的硬链接文件,参数中的文件名必须是确定的文件名和路径,而不能是使用模式的模糊形式(如:*.c)。通常情况下,搜索时可以添加 -xdev将搜索范围限定在单个文件系统内(硬链接不能跨文件系统指向),以减小find的遍历范围,但如果使用-L来追踪符号链接(即指向符号链接的硬链接),则不适合添加-xdev
- -inum inode号:根据inode号查找指定的路径下是否有对应文件
- -link 值n:查找有n个硬链接的文件,可以使用+n表示n个以上硬链接数,-n表示n个以下硬链接数
根据文件大小查找
- -size 值n根据文件大小查找
- 文件大小可以使用+表示大于,-表示小于,直接写数值表示等于
- 文件大小可以使用以下单位:
- b 默认单位,1b表示1个磁盘块(512bytes),在文件系统中,即便文件只有1bytes,也会占用一个1个块,因此该单位用来根据占用块的多少查找文件
- c表示字节,1c=1bytes
- k,M,G常用单位,表示KiB、MiB、GiB
- w表示一个字,1w=2bytes
测试是否为空
- empty查找空文件或空目录
根据文件所有者、所属组查找
find [起始查找路径] [选项] [用户名或组名]
- -user 用户名:根据文件所属用户查找,不能使用用户ID作为参数
- -uid 用户ID值n:根据文件所属用户ID值查找,值n可以使用+n或-n表示大于或小于该值的范围
- -nouser匹配属于已销户用户的文件,如果某位用户已从系统中删除,而文件仍属于该用户,则满足匹配
- -group 组名:根据文件所属用户组查找,允许使用用户组ID作为参数
- -gid 用户组ID值n:根据文件所属用户组ID值查找,值n可以使用+n或-n表示大于或小于该值的范围
- -nogroup:匹配属于已删除用户组的文件,,如果某个用户组已从系统中删除,而文件仍属于该用户组,则满足匹配
根据文件权限查找
- -readable匹配find命令执行者有r权限的文件
- -writable匹配find命令执行者有w权限的文件
- -executable匹配find命令执行者有x权限的文件
以上为GNU拓展,以下为POSIX标准选项
-perm 权限
- 权限的表示方法可以是权限值(如:755),也可以是符号模式(如:u=rw,g=r,o=r)
- 如果权限前无任何前缀,文件权限需要严格等于所指定的权限,可以使用以下前缀:
- /前缀用来表示文件只需要包含任意一个权限位即可,如-perm /111(或-perm /u=x,g=x,o=x)表示满足u=x,g=x,o=x中的任意一个条件即可
- -前缀用来表示文件必须至少包含所指定的权限,如:-perm -644(或-perm -u=rw,g=r,o=r)表示文件权限要大于等于644(rw-r–r–),这意味着755,744,655等大于该值的权限也满足匹配,而640不满足匹配(缺少其他用户的r权限)
根据时间属性查找
find [查找路径] [选项] [时间]
按天数匹配
- -atime 值n:根据文件上次访问时间匹配
- -ctime 值n:根据文件元信息修改时间匹配
- -mtime 值n:根据文件内容的修改时间匹配
上述选项用于匹配文件上次访问/修改元信息/修改文件内容是n*24小时以前的文件,时间会向下舍入,因此0表示不到24小时,1表示24-48小时之间。可以使用小数,但在值为小数时需要搭配+或-,以+n和-n形式使用(此时更推荐使用分钟数匹配)
按分钟匹配
- -amin 值n:根据文件访问时间匹配
- -cmin 值n:根据文件属性被修改时间匹配
- -mmin 值n:根据文件内容被修改时间匹配
- 上述时间值中,使用+表示超过该时间范围,-表示小于该时间内,直接写数值表示等于,同样可以使用小数
修改时间基准
- -daystart 从当天0点作为基准,开始计算时间(默认情况下是以find命令执行时的当前时间作为基准),该选项只影响在它之后的-atime等选项,如果-atime选项在-daystart之前则不受影响
比较两个文件的时间戳
find [查找路径] -newerXY 参考文件
- X代表搜索路径下要查找文件的时间戳类型
- Y代表参考文件的时间戳类型
- 如果查找路径下文件的时间戳X比参考文件时间戳Y晚,则视为true,满足匹配条件
- X和Y可以是以下值:
- a 上次访问时间
- B 文件创建时间(需要文件系统支持)
- c 文件元信息修改时间
- m 文件内容修改时间
- t “时间”:将查找路径下的文件时间戳与指定时间的时间戳进行比较,此时不需要再指定参考文件,时间戳来源由参考文件的访问/元信息修改/修改时间改为在命令行中明确指定,使用该参数时仅支持-newerXt形式(如:-newerat )
- -anewer 参考文件:等价于-neweram,匹配访问时间比参考文件修改时间晚的文件
- -cnewer 参考文件:等价于-newercm,匹配文件元信息修改时间比参考文件修改时间晚的文件
- -newer 参考文件:等价于-newermm,匹配文件修改时间比参考文件修改时间晚的文件
查找长期未使用文件
find [查找路径] -used 值n查找上次访问时间是上次元信息修改时间n天后的文件,常用于查找长期未访问的文件,以进行存档或删除
指定搜索深度
- -maxdepth N搜索深度最多为N层(所指定的搜索起始目录为0,因此-maxdepth 0将只匹配起始目录本身)
- -mindepth N搜索深度最小为N层
- 这两个选项是全局选项,应该放在其他选项之前,否则会抛出警告
-depth优先处理目录下的内容
默认情况下,find命令在遍历到一个目录时,会先处理目录本身,然后才会进入该目录进行遍历,对目录下的内容进行处理。这种默认顺序会在删除目录或修改权限时产生错误,如:使用find /path/dir -type d -delete删除dir下的目录,并删除dir目录本身,find命令会先尝试删除dir,但会由于dir目录下有内容而删除失败,-depth会反转操作顺序,让find先删除目录下的内容,再删除母目录
-depth在处理目录本身之前处理每个目录下内容
跳过目录
-prune跳过目录,不进入之前选项所匹配的目录下进行遍历
由于该选项的作用只是不让find进入某些目录遍历,因此具体不进入哪些目录需要通过其他选项来指定,但在搭配了其他选项时,这些选项又会将遍历结果筛选得只剩下满足要求的目录,同时-prune又禁止进入这些目录遍历,在组合搭配下,最后结果将只剩下前置选项匹配的目录本身。因此该选项通常需要搭配-o选项使用,来避免前置选项在-prune选项之前就筛选掉不需要跳过的目录,常用语法为:
find [搜索路径] -name “要排除的目录名” -prune -o [其他条件] -print
- -name可以任意替换为其他选项
- -prune只对它之前的一个选项有效,要跳过多个选项的目录需要使用分组实现,参考以下示例
-noleaf禁用基于硬链接的优化
在unix文件系统中,每个目录至少会有两个硬链接:指向自己的目录项.和目录名(父目录对它的引用),此外,该目录下每增加一个子目录就会为其增加一个硬链接..(在子目录创建时自动添加以指向父目录)
默认情况下,find命令会利用上述机制优化遍历操作,如果一个目录的硬链接数为2,意味着该目录下没有子目录(它是叶子目录),find将不会递归地搜索子目录以加快搜索(但find依旧会进入该目录搜索普通文件)。如果硬链接数大于2,则find会递归地搜索子目录。这一机制会导致find在搜索一些非unix文件系统时,错误地跳过一些目录的子目录,因为这些文件系统不一定维护和依赖硬链接,当系统中挂载了虚拟文件系统或网络文件系统,且需要使用find在这些文件系统中执行搜索时,需要禁用上述优化机制:
find [搜索路径] -noleaf [其他选项]禁用基于硬链接的叶目录判断机制,严格遍历所有文件
基于文件系统搜索
- -xdev 仅搜索当前文件系统,不跨越挂载点,当前的文件系统指搜索路径所处的文件系统,常用于对USB等设备的遍历查找
- -mount (旧版本语法)功能同上
- -fstype 文件系统:手动指定要搜索的文件系统类型,常用值有:autofs,ext3,ext4,nfs,proc,sshfs,sysfs,ufs,tmpfs,xfs,如果该选项指定文件系统与搜索路径所处文件系统不一致,则匹配结果为空
逻辑运算
命令分组
用于组合命令,()必须用\转义或加引号
- (expr)指定优先运算
逻辑非
排除满足匹配条件的文件
- ! expr逻辑非
- -not expr逻辑非
逻辑与
默认逻辑,-a和-and可省略,匹配同时满足多个条件的文件,短路运算,如果expr1为false,则不再尝试匹配expr2
- expr1 expr2逻辑与
- expr1 -a expr2逻辑与
- expr1 -and expr2逻辑与
逻辑或
查找满足任意一个条件的文件,如果expr1为true,则不会计算 expr2
- expr1 -o expr2逻辑或
- expr1 -or expr2逻辑或
逗号运算符
- expr1,expr2
expr1和expr2都会依次执行,不会短路。既不会像逻辑与一样如果前一个失败,后一个不执行,也不会像逻辑或一样如果前一个成功,后一个不执行。由于find的默认逻辑是多个选项之间的与运算,因此往往需要用该表达式执行不受前者影响的连续操作
常量true与false
- -true永远返回true
- -false永远返回false
匹配文件后执行操作
find命令支持在匹配到文件后直接执行打印、删除等操作,默认情况下,所指定的操作只会对前一个匹配条件生效,因此在指定多个匹配条件时,往往需要搭配()来指定操作命令
打印文件名
- -print(find命令的默认行为)打印文件名,并输出一个换行符,如果文件名本身包含换行符,应该使用-print0命令
- -print0用于输出包含换行符、空格等特殊字符的文件名,该选项会在每个输出的文件名后输出一个\0
- -fprint 文件名:将find命令的执行输出到指定文件中,文件不存在会新建,文件已存在会覆盖。如果find命令未匹配到任何文件,无输出,该选项依旧会创建文件
- -fprint0 文件名:将print0的输出写入指定文件
格式化打印
- -printf “格式字符串” 根据格式字符串输出指定信息,末尾不会输出换行符,因此如果需要换行符需要手动添加’\n’
- -fprintf 文件名 “格式字符串”:将printf选项输出结果输出到指定文件
- 转义字符、指定字段宽度和精度的方法与C语言printf函数一样,部分字符代表的含义不一样
| 字符 | 说明 |
|---|---|
| %p | 输出文件路径与文件名,路径表示形式取决于所给定的搜索路径,如:find . -name…输出形式为./path/file,find dir -name…输出形式为dir/path/file |
| %f | 输出文件名,即basename |
| %h | 输出文件路径,不包含文件名,即dirname |
| %P | 类似于%p,但路径中不包含搜索路径部分,输出形式为path/file |
| %H | 用户所指定的搜索路径,用于记录find命令的原始搜索路径 |
| %g | 文件所属组名,如果没有组名则输出ID |
| %G | 文件所属组ID |
| %u | 文件所有者,无用户名则输出用户ID |
| %U | 文件所有者ID |
| %m | 文件数字形式的权限值,如:644 |
| %M | 文件字符串形式的权限,如:-rw-r–r– |
| %s | 文件大小,以bytes为单位,没有能自动换算为M、G等单位的格式 |
| %b | 文件占用块的数量(512byte为一块),方便兼容其他命令的输出 |
| %k | 文件占用块的数量(以1K为一块),方便人类阅读 |
| %d | 文件在目录树中的深度,所指定搜索路径深度为0 |
| %D | 文件所在设备编号 |
| %F | 文件所在文件系统类型 |
| %l | 符号链接的对象 |
| %i | 文件的inode编号 |
| %n | 文件硬链接数量 |
| %y | 文件类型,具体类型参考-type选项,对于符号链接,%y会直接打印为l |
| %Y | 文件类型,对于符号链接,%Y会追踪并输出源文件类型,如果符号链接断开,打印”N”,如果是循环执行的符号链接,打印为”L”,如果出错无法检查,打印”?” |
| %a | 文件上次访问时间,输出格式为系统默认的时间样式,参考LANG和LOCALE区域设置 |
| %c | 文件上次修改元信息的时间,输出格式同上 |
| %t | 文件上次修改时间,输出格式同上 |
| %A时间格式 | 按照指定格式输出文件上次访问时间,格式参考下文 |
| %B时间格式 | 按照指定格式输出文件创建时间,如果文件系统不支持创建时间,则输出空 |
| %C时间格式 | 按照指定格式输出文件上次元信息修改时间 |
| %T时间格式 | 按照指定格式输出文件最后修改时间 |
%A,%B,%C,%T指定时间格式时,表示时间/日期的字符与date命令类似,但有以下不同:
- 由于%A,%B等参数已经带有%,因此表示时间和日期的字符不再需要%,如:Y代表年,%AY表示文件上次访问时间中的年份
- %A,%B等参数中不支持指定连续的时间/日期格式字符(不支持使用连续指定Ymd),需要反复使用%A前导,如:%AY%Am%Ad
- 以下字符代表的含义与date命令不同,其他大致一样:
| 格式 | 说明 |
|---|---|
| r | 12小时制时间hh:mm:ss[AP]M,如:12:15:05 AM |
| T | 24小时制时间hh:mm:ss.xxxxxxxxxx,秒有长小数,如:16:11:20.7624958610 |
| F | 日期yyy-mm-dd,如:2021-05-06 |
| + | 日期与时间,以+分隔,如:2004-04-28+22:22:05.00000000000 |
| @ | 时间戳,自1970年1月1日00:00至今的秒数 |
详细打印文件信息
- -ls详细列出匹配到的文件,输出结果类似于”ls -dils”命令执行结果
- -fls 文件名:将-ls的输出写入指定文件,工作方式与fprint类似
-quit立即退出
-quit 在匹配到一个结果并执行完-quit选项之前的操作后立即退出,不再继续遍历,用于快速找到一个结果后提前结束搜索
对找到文件的执行其他命令
- -exec 命令c {} \; 找到文件后执行命令c,find会对每一个找到的文件单独执行一次exec选项后指定的命令,命令c如果要用到文件名作为参数,会以匹配文件的完整路径作为参数执行命令。该选项会直接在find命令的搜索根路径下工作,不会进入匹配文件所在目录,然后以完整路径执行命令。适合那些可以接收完整路径作为命令参数的命令,如:cat,cp等,但它没有-execdir安全(参考下文)。-exec之后的所有参数都会作为命令c的一部分,直到遇到;为止,可以在命令c中使用{}代表当前正在处理的文件名
- -execdir 命令c {} \; (GNU拓展)找到文件后执行命令c,find会对每一个找到的文件单独执行一次execdir选项后指定的命令,命令c如果要用到文件名作为参数,会以匹配文件的文件名(不包含路径)作为参数执行命令。该选项在执行命令前,会进入匹配文件所在目录,然后直接以文件名作为命令执行参数,因此该选项适合执行那些命令参数中适合直接使用文件名,而不应该包含路径的命令(如:tar命令),它比-exec安全。同样,-execdir之后的所有参数都会作为命令c的一部分,直到遇到;为止,可以在命令c中使用{}代表当前正在处理的文件名
上述命令都使用;作为命令终止符,为了防止shell解析,;号需要使用引号包裹或转义符转义,写成\;或者‘;’形式
关于安全性:-execdir选项在执行命令前,会进入匹配文件所在目录,这一行为可能会带来安全风险。如果这些目录包含恶意程序(如:攻击者自定义的ls命令),而用户的PATH环境变量中包含了相对路径.或空值,则此时系统查找命令的路径也会随着切换到当前目录中,并且可能会将攻击者的程序作为系统命令执行,因此,-execdir会在命令执行前会检查PATH环境变量,要求PATH必须满足:
- 所有路径都必须是绝对路径(如”/bin:/usr/bin:/sbin:/usr/local/bin”合格)
- 不能包含空元素(如”/bin:/usr/bin::/usr/local/bin”中间::之间包含空元素)
- 不能包含相对路径(如”/bin:/usr/bin:.:/usr/local/bin:sbin”中包含相对路径.和非绝对路径目录sbin)
当PATH不满足上述要求时,find会在执行-execdir及其所指定的命令时拒绝执行命令并报错
#!/bin/bash
echo -e "\e[91m恶意脚本启动\e[0m"
为该文件赋予权限:
chmod +x ls
对于-execdir:
如果用户的PATH中包含相对路径
export PATH=".:$PATH"
此时在test目录下执行命令:
find . -name "*.txt" -execdir ls {} ';'
-execdir会在匹配到src/file.txt时,进入src目录,然后执行ls命令
系统根据PATH变量查找ls命令时,由于PATH包含.且优先级高,将直接执行当前目录下的ls而非系统的ls,由此,恶意程序将被成功执行
因此,-execdir被设计为如果PATH包含相对路径或者空值,将报错:
find: The current directory is included in the PATH environment variable, which is insecure in combination with the -execdir action of find. Please remove the current directory from your $PATH (that is, remove ".", doubled colons, or leading or trailing colons)
对于-exec:
-exec选项在执行命令时不会进入匹配文件的目录,因此在test目录下执行命令:
find . -name "*.txt" -exec ls {} \;
即便PATH包含相对路径,系统无法在test目录下找到ls可执行文件,会继续前往后续路径查找,因此也不会执行src/ls恶意程序
但如果在src目录下执行上述命令,恶意程序会被成功执行,因为此时PATH会引导系统执行当前路径下的ls文件,而-exec并不会检查PATH的值
因此,-exec的设计哲学为:-exec本身不会切换路径,并没有切换目录带来的安全风险,也不依赖PATH的值,用户需要自行确认所搜索的目录是安全的!以避免搜索的根路径下有恶意程序
批量处理
-exec 命令 {} + 找到文件后直接执行命令(批量模式),find命令会对找到的文件统一执行exec选项后指定的命令。find会收集所有匹配的文件并存储到{}中,命令中只允许出现一个{},且必须出现在末尾,+号之前,这意味着执行cp等命令需要依赖xargs等命令
-execdir 命令 {} + (GNU拓展)找到文件后直接执行命令(批量模式),其他同上
-ok 命令 {} \; 找到文件后会每个文件逐一询问是否执行命令,执行命令时会将所匹配文件的路径和文件名传递给所指定命令,ok选项不支持+批量模式(因为需要逐条确认)
-okdir 命令 {} \;找到文件后会每个文件逐一询问是否执行命令,执行命令时会进入文件所在目录,只将文件名传递给所执行命令,与-ok选项的区别等同于-exec和-execdir
上述命令中,{}为find命令专有占位符,用于传递find命令找到的文件,find会将其作为参数传递给exec/ok选项后的那些将要执行的命令。;是exec/ok选项的结束标记,当指定了多个需要执行的命令时,exec/ok选项需要通过;来识别命令是否输入结束,但由于;是shell的命令分隔符,因此find命令中的;需要进行转义,因此需要添加一个额外的转义符\。在与-quit搭配时,find在退出前会执行-exec {} +已经收集到的文件,然后执行一次-exec后所指定的命令,然后退出
locate 文件查找工具
locate为一个文件查找工具,可以从yum源安装
find命令为在指定目录下遍历查找,会占用大量系统资源,而且查找速度较慢,locate会建立文件资料库,然后在资料库中查找,反应速度快。
locate [-i] 文件名
- -i 不区分大小写
- locate会定期更新资料库,但实时新建的文件可能会找不到,可以在root下使用 updatedb 命令手动更新资料库
- locate 不会将/tmp等临时缓存文件收录到资料库中,因此临时文件使用locate找不到
压缩与解压缩
文件的压缩与解压(.gz格式)
.gz是GNU gzip软件的压缩格式,与windows不同,下述命令只能压缩与解压缩文件,不能处理文件夹,并且压缩完只保留压缩文件,不保留原文件
- gzip 文件名 压缩(GUN zip)
- gunzip 文件名 解压缩(GUN unzip)
- gzcat 文件名 原来查看压缩过的文本文件内容
文件的打包、压缩与解压(.tar.gz格式)
打包与压缩
tar命令用于文件的归档打包,它将指定的文件或目录以指定的方式进行组织和存储,包括文件的权限、所有者、时间戳等信息,并打包成一个单独的文件,打包后的文件格式一般为.tar,打包后的文件可以用gzip命令压缩,生成.tar.gz(或.tgz)格式的压缩包文件,tar命令也支持直接将文件重定向给gzip命令,一次性完成打包、压缩操作,打包压缩后的文件名可以不写.tar.gz等后缀,但不方便用户识别
tar [参数] [打包后文件名] [打包文件/目录] 打包文件或目录
- -c(--create) 打包为一个新的归档文件
- -z 将输出重定向给gzip命令,即打包后压缩(需要和-c等参数一起使用)
- -r(--append) 追加文件到已有tar归档文件末尾
- -A(--concatenate) 将一个已有tar归档文件追加到另一个已有tar归档文件
- -d(--diff) 检查该文件和其在归档文件中的不同之处,如果被修改则标记为changed,被删除标记为deleted,该文件未被打包到归档文件中则标记为added
- --delete 从已有tar归档文件中删除
- -u(--update) 将比tar归档文件中已有的同名文件新的文件追加到该tar归档文件中
- -p 保留所有文件权限
- -v 显示详细信息
- -t(--list) 列出已有tar归档文件的内容
- -f 指定文件名(该参数必须)
解压
tar [参数] [解压缩的文件]
- -x 解包,提取文件
- -v 显示详细信息
- -f 指定解压缩的文件(该参数必须)
- -z 解包后解压缩(需要和x参数一起使用)
最常用的是解压一个.tar.gz文件,因此大多数情况下-zxf为必用参数
示例: # tar -zxvf test.tar.gz 解压缩test.tar.gz文件,并显示详细信息
.zip格式的压缩与解压
zip [选项] [-r] [压缩后文件名] [压缩文件或目录]
- -r 压缩目录
.zip格式为Linux和windows通用格式,zip命令会保留原文件,并且一个命令就可以处理文件与文件夹
unzip [解压的文件名]
解压文件
.bz2、.tar.bz2格式的压缩与解压
1. 压缩
对文件(格式为.bz2)
bzip2 [参数] [-k][文件]
- -k 压缩后保留原文件
对文件夹(格式为.tar.bz2)
tar -jcf [压缩后文件名] [压缩目录]
即将tar中的z参数改为j参数就是压缩为.tar.bz2格式
2. 解压
对文件(格式为.bz2)
bunzip2 [-k] [解压文件]
- -k 解压缩后保留原文件
对文件夹(格式为.tar.bz2)
tar -jxf [解压文件]
同样将tar中的z参数改为j参数就是解压.tar.bz2格式