<
  • 主题:
  • + -
  • 清除背景
  • 禁用背景
目 录
  1. 1. 查看文件与目录信息
    1. 1.1. ls查看文件与目录信息(list)
    2. 1.2. ls命令的输出信息
    3. 1.3. stat查看文件与文件系统状态
    4. 1.4. dir与vdir列出目录信息
    5. 1.5. dircolors设置ls命令的打印样式
  2. 2. 目录操作
    1. 2.1. mkdir创建目录(make directory)
    2. 2.2. cd切换目录(change directory)
    3. 2.3. pwd查看当前路径(print working directory)
    4. 2.4. rmdir删除空目录(remove empty directory)
  3. 3. 文件操作
    1. 3.1. touch创建空文件
    2. 3.2. 查看文件
      1. 3.2.1. cat查看短文件内容
      2. 3.2.2. tac反向查看短文件内容
      3. 3.2.3. more查看长文件内容
      4. 3.2.4. head&tail仅查看前几行或后几行
      5. 3.2.5. nl显示行号与内容(number line)
    3. 3.3. rm删除文件与目录(remove)
    4. 3.4. shred覆盖与删除文件
    5. 3.5. unlink删除文件
    6. 3.6. cp复制文件或目录(copy)
    7. 3.7. dd按指定块大小复制和处理文件
    8. 3.8. install复制程序文件
    9. 3.9. mv移动文件与重命名(move)
    10. 3.10. 以指定格式打开文件
      1. 3.10.1. od以指定进制打开文件(octal dump)
      2. 3.10.2. base64解码与编码文件
      3. 3.10.3. basenc多格式解码与编码文件
    11. 3.11. 格式化输出内容
      1. 3.11.1. fmt格式化行(format)
      2. 3.11.2. pr文件分页与打印(print)
      3. 3.11.3. fold强制文本行换行
      4. 3.11.4. split文件拆分
      5. 3.11.5. csplit按内容拆分文件
    12. 3.12. 合并文件
      1. 3.12.1. paste合并文件
      2. 3.12.2. join 按字段合并文件
    13. 3.13. comm逐行比较两个排序好的文件
    14. 3.14. 文件校验
      1. 3.14.1. sum计算文件占用的磁盘块数与校验和
      2. 3.14.2. cksum计算文件校验和
      3. 3.14.3. md5/b2/sha1校验文件
    15. 3.15. file查看文件类型
    16. 3.16. sync将缓存写入磁盘
    17. 3.17. truncate扩大或缩小文件大小
  4. 4. 处理文件路径
    1. 4.1. basename提取文件名
    2. 4.2. dirname提取路径
    3. 4.3. pathchk检查文件名是否有效
    4. 4.4. realpath获取绝对路径与相对路径
  5. 5. find文件查找
    1. 5.1. 根据文件名查找
    2. 5.2. 根据完整路径查找
    3. 5.3. 根据文件类型查找
    4. 5.4. 处理符号链接
    5. 5.5. 处理硬链接
    6. 5.6. 根据文件大小查找
    7. 5.7. 测试是否为空
    8. 5.8. 根据文件所有者、所属组查找
    9. 5.9. 根据文件权限查找
    10. 5.10. 根据时间属性查找
      1. 5.10.1. 按天数匹配
      2. 5.10.2. 按分钟匹配
      3. 5.10.3. 修改时间基准
      4. 5.10.4. 比较两个文件的时间戳
      5. 5.10.5. 查找长期未使用文件
    11. 5.11. 指定搜索深度
    12. 5.12. -depth优先处理目录下的内容
    13. 5.13. 跳过目录
    14. 5.14. -noleaf禁用基于硬链接的优化
    15. 5.15. 基于文件系统搜索
    16. 5.16. 逻辑运算
    17. 5.17. 匹配文件后执行操作
      1. 5.17.1. 打印文件名
      2. 5.17.2. 格式化打印
      3. 5.17.3. 详细打印文件信息
      4. 5.17.4. -quit立即退出
      5. 5.17.5. 对找到文件的执行其他命令
  6. 6. locate 文件查找工具
  7. 7. 压缩与解压缩
    1. 7.1. 文件的压缩与解压(.gz格式)
    2. 7.2. 文件的打包、压缩与解压(.tar.gz格式)
      1. 7.2.1. 打包与压缩
      2. 7.2.2. 解压
    3. 7.3. .zip格式的压缩与解压
    4. 7.4. .bz2、.tar.bz2格式的压缩与解压
      1. 7.4.1. 1. 压缩
      2. 7.4.2. 2. 解压

Linux文件操作

字数:38379 写于:2021-12-29
最新更新:2021-12-29 阅读本文预计花费您110分钟

查看文件与目录信息

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)反向排序,以上排序相关的输出信息都可以用该选项反序输出
示例: 1. 列出当前目录所含非隐藏文件或文件夹 ls 该命令会返回当前目录下的非隐藏文件和文件夹 config.json data modifyPort.sh 2. 列出当前目录所含非隐藏文件或文件夹详细信息 ll #该命令等价于ls -l 该命令会输出目录总大小,以及每个目录和文件的详细信息 total 12 -rw-r--r-- 1 root root 52 Aug 18 14:14 config.json drwxr-xr-x 2 root root 4096 Aug 18 14:15 data -rwxr-xr-x 1 root root 869 Aug 18 14:15 modifyPort.sh 3. 列出当前目录的详细信息,而非当前目录所包含文件的信息 ls -ld 当前目录以.号表示 drwxr-xr-x 3 root root 4096 Aug 18 14:15 . 4. 列出当前目录的详细信息,包括隐藏文件,文件的大小换算为KB、MB等单位,并标识出可执行文件、目录等 #ls -alhF ./表示当前目录,../表示上一级目录,文件名后添加*表示该文件是可执行文件,文件名后添加/表示这是一个目录,且会用不同的颜色高亮显示 total 20K drwxr-xr-x 3 root root 4.0K Aug 18 14:15 ./ dr-xr-xr-x. 20 root root 4.0K Aug 18 14:13 ../ -rw-r--r-- 1 root root 52 Aug 18 14:14 config.json drwxr-xr-x 2 root root 4.0K Aug 18 14:15 data/ -rwxr-xr-x 1 root root 869 Aug 18 14:15 modifyPort.sh*

ls命令还可以搭配一些正则表达式只显示自己想看的文件信息

1.使用?表示一个字符,*表示零个或多个字符,如输出my_开头的文件信息 # ls -l my_* 2. 使用[ ]包裹多个字符,如:查看是否有fall,fbll,fcll,fdll文件 # ls -l f[a-d]ll 3. 使用!排除不需要的内容,如不查看fall,但查看其余的文件 # ls -l f[!a]ll

ls命令的输出信息

使用ls -l等命令列出文件详细信息,文件信息格式类似于

 drwxr-xr-x.  6  root  root  4.0K  Feb  9  11:53  home 
字段一

第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 文件状态最后更改时间
1. 查看文件详细信息 stat modifyPort.sh 该命令的输出值通常包含以下内容: File: ‘modifyPort.sh’ Size: 869 Blocks: 8 IO Block: 4096 regular file Device: fd01h/64769d Inode: 1572872 Links: 1 Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2024-08-18 14:15:45.866848485 +0800 Modify: 2024-08-18 14:15:45.866848485 +0800 Change: 2024-08-18 14:15:45.866848485 +0800 Birth: - 其中: file:文件名 size:文件大小 Blocks:文件占用的数据块数量,文件系统中的数据以块的形式存储,块的大小取决于文件系统 IO Block:文件系统的I/O块大小,也就是读写文件时的块大小 Device:文件所在设备的ID号,分别用十六进制和十进制表示 Inode:文件的inode号 Links:链接到该inode的文件名数量,值为1表示这个文件没有其他硬链接 Access:文件当前权限 Uid:文件所有者的ID号和用户名 Gid:文件所有者所属组GID号和组名 Access:文件最后访问时间 Modify:文件最后修改时间 Change:文件元数据(如文件权限、所有者)最后一次被更改的时间 Birth:文件的创建时间。某些文件系统不支持记录文件的创建时间,会显示为 - 2. 可用手动指定文件信息输出形式 stat -c "%n:文件大小%s 文件权限%a 文件类型%F 文件修改时间%y" modifyPort.sh 输出值: modifyPort.sh:文件大小869 文件权限755 文件类型regular file 文件修改时间2024-08-11 18:06:36.179331522 +0800

Linux系统可能挂载了多个文件系统(例如,根文件系统 /、用户主目录 /home、临时文件系统 /tmp 等),而每个文件系统可能具有不同的属性和状态。stat支持通过-f选项确定文件所属的文件系统,从而提供与该文件系统相关的信息

查看根目录所属文件系统的状态 stat -f / 返回值通常包括以下信息: File: "/" ID: 518e09c078cb0c63 Namelen: 255 Type: ext2/ext3 Block size: 4096 Fundamental block size: 4096 Blocks: Total: 10288203 Free: 9569130 Available: 9093203 Inodes: Total: 2621440 Free: 2556389 其中: File:所指定的文件名或路径 ID:文件系统的标识符,这个十六进制 ID 对应于特定的文件系统类型 Namelen:文件系统允许的最大文件名长度(字符数) Type:文件系统类型的名称,可能为 ext2/ext3等值 Block size:文件系统块的大小(以字节为单位) Fundamental block size:基础块大小,通常与文件系统块大小相同 Blocks:Total为文件系统中的总块数,Free为文件系统中未分配的块数,Available为当前用户可用的块数(可能会比 Free 少,因为一些块可能被保留给超级用户) Inodes:Total为文件系统中的总inode 数,每个inode表示一个文件或目录。Free为未使用的 inode 数,意味着还可以创建的文件或目录数量

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变量的每个颜色设置都打印在单独的行上,并且该行会输出为对应的颜色,方便即时查看当前的颜色设置
正常情况下,LS_COLORS变量的值很长,直接修改变量值极其不方便,因此通常会通过以下步骤修改ls等命令的输出样式 1. 如果系统本身提供了 /etc/DIR_COLORS 文件,可以直接修改该文件的内容 如果系统未提供该文件,用户可以通过以下命令生成 dircolors -p > ~/.dircolors 该命令会新建.dircolors文件并将当前的默认配置写入该文件中,该文件通常包括以下三部分内容: 第一部分为终端定义,用于定义哪些终端类型支持颜色显示,并根据终端类型决定是否启用颜色,通常使用系统默认即可,内容示例: COLORTERM ?* TERM Eterm TERM ansi 第二部分用来定义不同文件类型的标识样式,用户可以自定义,如: DIR 01;34 #目录的标识样式,01表示加粗高亮,34为蓝色 LINK 01;36 #链接文件的标识样式,01表示加粗高亮,36为青色 ..... 第三部分为不同后缀文件的输出样式,用户可以自定义,如: .tar 01;31 #后缀为.tar的文件标识样式为高亮(01)红色(31) .... .jpg 01;35 #后缀为.jpg的文件标识样式为高亮(01)品红(35) .... 颜色代码参考终端样式控制 2. 编辑完.dircolors文件后,在用户的 ~/.bashrc 或 ~/.profile 文件中,添加以下行以应用颜色设置 eval "$(dircolors ~/.dircolors)" 该命令中: dircolors ~/.dircolors(等价于dircolors -b ~/.dircolors)命令会生成新的LS_COLORS值,并生成export LS_COLORS语句 eval命令会执行上述生成的命令 由此,下次终端启动就会使用用户定义的标识样式 3. 如果需要更改立即生效,可以重新加载配置文件 source ~/.bashrc

目录操作

mkdir创建目录(make directory)

mkdir [参数] 目录名

  • 可以指定多个目录名来同时创建多个目录
  • -p 递归创建目录,可以在不存在的目录下创建新目录
  • -m 权限:创建目录同时指定目录的权限,接收的参数支持权限的八进制值表示形式(如755),也支持符号模式(如:移除组的写权限g-w)
  • -v 每创建一个目录,打印一条消息
示例: # mkdir tmp/test/newdir 在tmp目录下创建test目录及其子目录newdir,如果tmp目录下没有test目录,将提示无test目录,此时可以用-p参数 # mkdir -p tmp/test/newdir 将在tmp下新建test,再在test下新建newdir目录 # mkdir newdir1 newdir2 newdir3 在当前路径下新建三个目录

cd切换目录(change directory)

cd 目录名

  • 目录名可以用 Tab键 补全
  • . 表示当前目录,因此cd .不会改变当前目录,cd ./dir则会进入当前目录下的dir目录中,等价于cd dir
  • .. 表示上一级目录,可以使用cd .. 返回上一级目录,必要时可以使用多个双点符来向上切换多层目录
  • cd -会返回上一个工作目录,这个值被保存在OLDPWD环境变量中
[root@vultr etc]# cd ../../etc

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
示例: # touch file1 file2 创建两个文件file1、file2 # touch "fi le" 创建一个名为fi le的文件

查看文件

cat查看短文件内容

cat [选项] [文件名]

  • -n  显示行号(从1开始),包括空白行
  • -b  空白行行不显示行号,只为有文本的行添加行号(从1开始)
  • -s  删除连续的多个空白行,只显示一行空白行
  • -T  使用^T替换所有制表符
    从头到尾正常显示文件
tac反向查看短文件内容

tac [选项] [文件名]
cat反写,从尾到头显示文件(文件末行为第一行)

  • -s “分隔符”:指定分隔符,默认是换行符
  • -b 将分隔符添加到记录开头
  • -r 将分隔符字符串识别为正则表达式
这里只示例指定分隔符的情况,假设test.txt文件内容为 AAAA,BBBB,CCCC 执行命令:tac -s "," test.txt 输出为: CCCC #由于原文件CCCC后有换行符,因此这里CCCC之后也输出一个换行符 BBBB,AAAA, 执行命令:tac -b -s "," test.txt 输出为: ,CCCC #分隔符将被添加到记录开头 ,BBBBAAAA
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
(1) nl data.txt 默认情况下,nl命令会在左侧标出行号,并且行号宽度为6位,空白行将被跳过 1 AAAA 2 BBBB
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选项进行递归删除时,避免意外删除另一文件系统的内容
1. 依次进行询问 # rm -i f?ll 2. 删除以-开头的文件 rm -‌- -filename

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(保留所有)
示例: # cp /file/test1 /file/test2 /newdir 复制文件test1和test2到newdir目录中 # cp -p install.log /tem 复制install.log文件到tem目录中并保留install.log文件信息(不使用-p参数则文件最后修改时间为执行复制操作的当前时间) # cp -r /usr/dir /tem/newdir 复制目录dir到tem目录下并命名为newdir

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文档
1.从/dev/zero文件读取数据,清空磁盘或分区 dd if=/dev/zero of=/dev/sda bs=1M 2. 测试磁盘读写速度 测试写速度并计时 time dd if=/dev/zero of=testfile bs=64M count=64 oflag=direct 测试读速度并计时,要确保testfile文件存在 time dd if=testfile of=/dev/null bs=64M iflag=direct 3. bs的值不宜太大 dd if=/dev/zero of=testfile bs=2G count=1 虽然该命令合法,但在读写时,dd命令会尝试一次性分配2GiB内存来缓冲该数据,有可能会因内存不足而失败,或者超出系统的I/O缓冲区限制

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 解码时忽略换行符和无法识别的字节,而尝试尽可能解码剩余的字节,数据包在网络中传输时,可能会被分割和损坏,该选项会忽略数据分割形成的换行符和传输损坏的数据
如:/dev/urandom是特殊的设备文件,该文件可以用来生成随机数,但该文件返回值是二进制数据,直接查看会解析成乱码,需要将其转为文本数据 head -c 10 /dev/urandom | base64 输出值为: KhXWNVbInIhkxw==
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 “#”将只格式化以#开头的行(如:注释行)
e.g.假设文件test.txt中有以下内容 1. AAA AA AA A AAAAA 2. This is a very long line that we want to format using the fmt command. The fmt command is useful for text formatting. 3. BBB BB BB B BBBBB 默认情况下,fmt命令会合并行,每行输出75字符 1. AAA AA AA A AAAAA 2. This is a very long line that we want to format using the fmt command. The fmt command is useful for text formatting. 3. BBB BB BB B BBBBB -w选项可以指定每行的输出字符数量 fmt -w 30 test.txt 输出的行包含换行符在内为30个字符 1. AAA AA AA A AAAAA 2. This is a very long line that we want to format using the fmt command. The fmt command is useful for text formatting. 3. BBB BB BB B BBBBB -s选项可以保留短行不合并,拆分长行 1. AAA AA AA A AAAAA 2. This is a very long line that we want to format using the fmt command. The fmt command is useful for text formatting. 3. BBB BB BB B BBBBB -t选项可以保留编号等格式 fmt -t test.txt 输出为: 1. AAA AA AA A AAAAA 2. This is a very long line that we want to format using the fmt command. The fmt command is useful for text formatting. 3. BBB BB BB B BBBBB
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=值:指定文件的数字后缀从该值开始
e.g.拆分文件test 1. 每个文件写入100行 split -l 100 test test中的内容会被拆分到以下文件中:xaa xab xac.... 2.指定新文件的文件名,并使用数字作为文件后缀 split -l 100 -d test newFile 拆分后文件名为:newFile01 newFile02.... 3.指定文件的固定后缀 split -l 100 -d --additional-suffix=.txt test newFile_ 拆分后文件名为:newFile_01.txt newFile_02.txt ....
csplit按内容拆分文件

csplit是一个用于按特定模式或位置分割文件的命令,与split不同,csplit可以根据正则表达式模式匹配或指定行号将文件拆分为多个部分,适合处理需要基于内容分割的场景

csplit [选项] 文件名 ‘正则表达式/PATTERN/或行数n’ ‘{重复次数}’

  • 默认情况下,命令会在内容写入文件后打印该文件的大小(字节数)
  • 如果指定正则表达式,命令会在匹配处分割文件,并且匹配的这一行会写入下一个文件。如果还指定了重复次数,则会继续查找下一次匹配的内容,默认只匹配一次
  • 如果指定的是行的数量,则从数量对应的该行处分割文件,并且该行写入下一个文件。如果指定重复次数,也会继续进行分割
  • 分割后生成的文件名默认为xx00,xx01,xx02…..
  • -f 字符串:指定生成的文件名前缀,默认是xx
  • -b 格式字符串:指定生成文件名的后缀,默认为%02d(两位数字)
  • -n 值:指定生成文件名后缀中的数字位数,默认为2
  • -k 遇到错误,不要删除输出文件
  • -z 删除大小为 0 的输出文件
  • -s或-q:不打印每个文件大小
e.g.文件test的内容为: AAAA 1111 BBBB CCCC 2222 DDDD 在文件中包含数字的行处进行分割(默认分割一次) csplit test '/[0-9]/' 分割以后的文件为: xx00文件: AAAA xx01文件: 1111 BBBB CCCC 2222 DDDD 在文件中包含数字的行处进行分割,并分割任意多次 csplit test '/[0-9]/' '{*}' 分割以后的文件为: xx00文件: AAAA xx01文件: 1111 BBBB CCCC xx02文件: 2222 DDDD

合并文件

paste合并文件

paste [选项] [文件名1] [文件名2]…

  • 默认情况下,如果命令只指定一个文件,paste会原样输出文件;如果指定多个文件,该命令会将多个文件的第一行都粘贴到第一行,第二行都粘贴到第二行,依此类推,同一行内容之间使用tab分隔
  • -s 如果只指定一个文件,命令会将该文件的所有内容合并到同一行上,以tab分隔。如果指定多个文件,命令会将文件1的内容都粘贴到第一行,文件2内容粘贴到第二行,其他文件以此类推
  • -d “字符1字符2..”:使用指定的字符作为内容分隔符,默认为tab,可以指定多个字符,这些字符会循环使用,文件合并后的内容将写为:文件1字符1文件2字符2
  • paste - - - paste命令的特殊用法,允许命令从标准输入中将每n行合并为1行,n取决于-的数量,每个-间有空格
e.g.文件num.txt内容为 1111 2222 3333 文件test.txt内容为 AAAA BBBB 1.将num.txt的文件容合并到同一行上 paste -s num.txt 输出为: 1111 2222 3333 指定分隔符 paste -d ';' -s num.txt 输出为: 1111;2222;3333 2. 合并文件num.txt与test.txt paste test.txt num.txt 合并后为: AAAAA 1111 BBBBB 2222   3333 2. -s选项 AAAAA BBBBB 1111  2222 3333 3. -d选项 paste -d "%-" test num test 合并后为: AAAAA%1111_AAAAA BBBBB%2222_BBBBB %3333_
paste - - -的用法 1.将file文件每4行合并为一行,合并的行之间用tab分隔 paste - - - - < file.txt 2.在脚本或终端将多行输入每3行合并为1行 paste - - - <<EOF ... ... EOF 或从管道 echo -e "a\nb\nc\nd\ne\nf" | paste - - - 输出: a b c d e f 3.Bash支持一种特殊输入方法,将字符串作为标准输入 paste - - - <<< $'a\nb\nc' 4.支持文件和标准输入混合合并 paste file1.txt - - file2.txt 第 1 列:来自 file1.txt 第 2、3 列:来自标准输入 第 4 列:来自 file2.txt
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:将输入文件的第一行视为标题行,并合并打印到第一行
e.g.文件file1: a 1 b 2 e 5 文件file2: a X e Y f Z 1. 输出第一个字段相同的行 join file1 file2 输出值: a 1 X e 5 Y 2. 指定哪些字段需要输出,0表示整行都输出 join -o 1.2 2.2 file1 file2 3. 输出没有匹配到的行。如果使用 -a 1,将输出文件1中所有未匹配到的行 join -a 1 file1 file2

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退出命令,适合多文件处理时,所有文件都必须校验通过的场景
1. 生成校验和 cksum test.txt #命令用法大致相同 会输出文件的校验和、文件大小、文件名,可以通过校验和与文件大小来判断文件是否被修改 3647810268 85 test.txt 2. 校验文件 通常,文件的校验和信息会存储于一个专门的校验和文件中,如:checksums.md5文件中有以下内容 d41d8cd98f00b204e9800998ecf8427e /home/user/file1.txt 098f6bcd4621d373cade4e832627b4f6 /home/user/file2.txt 执行校验命令: md5sum -c checksums.md5 命令会逐行读取checksums.md5文件内容,然后根据内容前往文件相应路径下打开该文件并计算其校验和,再与checksums.md5文件所记录的校验和进行对比,最后逐行输出每个文件的校验结果 file1.txt: OK #校验成功 file2.txt: FAILED #校验失败

file查看文件类型

file [选项] 文件名查看文件类型

  • -i 显示文件的MIME 类型,而不是传统的文件类型描述,如:text/plain; charset=us-ascii
  • -b 显示结果去掉文件名,只显示文件信息

file命令会检查文件内容的特征,而不仅仅通过文件扩展名来识别文件的实际类型,这对于处理没有扩展名或扩展名不正确的文件特别有用,命令可以识别文本文件(文本文件还可以识别它的编码格式)、可执行文件、图像文件、压缩文件等多种类型

file命令可以帮助我们提前探测文件内容,并返回具体类型,如: file my_file 返回: ASCII text说明该文件是ASCII编码的文本文件 directory说明是一个目录 symbolic link to 'data_file'说明是一个软链接文件并链接到了data_file文件 Bourne-Again shell script, ASCII text executable说明该可执行程序编译或执行所面向的平台或库

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 来清空文件内容
1. 创建一个1G文件 truncate -s 1G myfile.bin 2. 将example.txt调整为5M大小 truncate -s 5M example.txt 3.在当前文件大小基础上增大1M truncate -s +1M example.txt 4.将文件大小缩小为512的倍数 如果文件example.txt原大小为1000bytes,将缩小为512bytes truncate -s /512 example.txt 5.将文件大小扩大为512的倍数 如果文件example.txt原大小为1000bytes,将扩大为1024bytes truncate -s %512 example.txt

处理文件路径

这些命令不会去验证所指定的文件或路径是否存在,只是单纯返回所给定的路径字符串中的某个部分

basename提取文件名

该命令用于从文件路径中删除路径和文件后缀,提取纯净的文件名或目录名,方便使用干净的文件名进行重命名或备份

basename 文件路径 [要删除的文件后缀]

basename [选项] 文件路径

  • 默认情况下,命令会去除文件或目录的路径部分
  • -a 在指定多个路径时需要使用该选项,该选项会将每个参数视为一个文件路径,而不是要删除的文件后缀
  • -s 后缀字符串:指定需要删除的文件后缀,该选项适合第二种命令,GNU版本的basename命令,使用-s选项会默认隐式启用-a选项
  • -z 在每行输出末尾输出空字符(null),而不是换行符
1. 删除路径和后缀(命令会隐式启用-a选项以解析多个路径) basename -s .txt /home/user/file1.txt /home/user/file2.txt 输出: file1 file2 2. 处理目录 basename /home/user/documents/ 输出:documents 3.一次性处理多个路径 basename -a /path/file1.txt /path/file2.html /path/file3.sh 输出: file1.txt file2.html file3.sh

dirname提取路径

该命令与basename命令相反,它会获取文件路径而去除文件名

dirname [选项] 文件路径

  • 可以同时指定多个路径而不需要任何选项
  • 如果指定一个文件而不包含/路径,则返回的路径为.(当前目录)
  • -z 在每行输出末尾输出空字符(null),而不是换行符
1. 获取文件路径 dirname /path/to/file1.txt /home/user1/test.sh 输出: /path/to /home/user1 2. 获取目录的路径 dirname /myshell/new/checkOS/ 输出:/myshell/new 3. 单个文件的路径为. dirname checkOS.sh 输出: .(当前目录)

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),而不是换行符,方便将输出交给其他程序解析
e.g.有以下文件结构 /mydir ├── index.html ├── source │ └──css/index.css │ └──js/main.js └── public └──link_js --> /mydir/source/js └── config.json 假设当前位于/mydir路径下 1. 输出指定文件的绝对路径,默认情况下,符号链接会解析为其源文件或目录 realpath index.html source/css/index.css public/link_js 输出: /mydir/index.html /mydir/source/css/index.css /mydir/source/js # 符号链接指向的目录 2.输出config.json相对js目录的相对路径 realpath --relative-to=source/js public/config.json 输出: ../../public/config.json 3.输出config.json与main.js文件的相对路径 realpath --relative-to=source/js/main.js public/config.json 输出: ../../../public/config.json 当计算相对路径的对象为文件时,通常会输出一个额外../(main.js到js目录,js到source目录,source到mydir目录,三个../) 3.以/mydir/source为基准(路径起点),输出指定文件的路径 realpath --relative-base=source source/css/index.css index.html public/link_js public/config.json 如果文件属于基路径的子目录下,输出相对路径,该基目录以外的文件,输出绝对路径 css/index.css /mydir/index.html js /mydir/public/config.json 4. 同时使用--relative-to和--relative-base 以/mydir/source为基准(路径起点),输出其他文件相对于source/css目录的相对路径 realpath --relative-base=source --relative-to=source/css source/css/index.css index.html public/config.json public/link_js 类似的,如果文件属于基路径的子目录下,输出相对于--relative-base的相对路径,该基目录以外的文件,输出绝对路径 index.css /mydir/index.html /mydir/public/config.json ../js

find文件查找

find命令可能占用大量的系统资源,尽量避免在系统使用高峰期频繁使用find查找文件,文件查找范围应该尽可能小

find [起始查找路径] [选项] [选项对应的查找表达式]

  • 不指定起始查找路径时,默认从当前目录.开始,起始查找路径可以指定多个,空格分隔
  • -files0-from 文件名:(GNU拓展)从该文件中读取起始查找路径而不是从命令行参数,文件中指定多个路径时,必须使用 ASCII NUL字符(\0)分隔,以避免文件名中含有空格、换行符等特殊字符。可以使用-files0-from -表示从标准输入读取查找路径,方便从管道等地方输入查找路径
  • 在可以使用通配符(参数标识为pattern)的选项中,通配符必须用引号包裹,防止shell提前扩展通配符(*匹配任意数量字符,一个?匹配一个字符,[]匹配多个表示或的字符)
  • 搜索范围应尽可能小,尽量避免在根目录下搜索
向文件正确写入\0的方法: 1.直接生成含 null 分隔符的文件 printf "path1\0path2\0" > paths.txt 2.或从已有路径列表生成(每行一个路径) echo -e "path1\npath2" | tr '\n' '\0' > paths.txt 3.通过vim直接写入\0会被视为两个字符,正确插入方法是: 在插入模式下,按 Ctrl+V,然后输入 Ctrl+@(显示为 ^@) 4.通过cat -v paths.txt查看是否正确写入了NUL字符

find的工作流程:

find 命令会以所指定的查找路径作为起点,递归地执行深度优先遍历(可通过 -maxdepth 或 -mindepth 控制遍历深度),在遍历过程中,find会依次访问路径下的所有文件和子目录(但可以使用 -prune 等选项主动排除特定目录),对于访问到的每个文件或目录,find会按照命令行中的条件表达式从从左到右的顺序,逐一检查其是否满足指定的条件(如:-name检查文件名、-type检查文件类型等,可以使用-and、-or等逻辑运算组合这些条件),当条件满足时,find命令会对匹配的文件执行指定的操作(默认动作是打印该条目的完整路径),如果条件不满足,则跳过该条目,继续处理下一个。

根据文件名查找

  • -name “pattern”根据文件名查找
  • -iname “pattern”根据文件名查找(不区分大小写,GNU拓展)
  • pattern不应该包含任何/以及路径,-name a/b永远不会匹配任何内容,匹配路径应该使用-path或-regex
示例: # find /etc -name init 在/etc目录下查找init文件 # find /etc -name *init* 在/etc目录下查找所有文件名带init的文件 # find /etc -name init??? 在/etc目录下查找所有文件名init开头,后面跟3个字符的文件

根据完整路径查找

  • -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(扩展正则表达式)
假设有以下文件结构 ~/test/ ├── src/ │  ├── main.c │  └── lib/ │   └── util.c ├── build/ │  └── main.o └── 20250710.log e.g查找所有.c文件 1.-path和-regex都能递归找出子目录下的文件 find test -path "*.c" 2.-regex中的.需要转义,防止解析为正则表达式 find test -regex ".*\.c" 3.所指定的搜索路径会影响命令输出结果 在~目录下执行 find . -path "*.c" 返回值: ./test/src/main.c ./test/src/lib/util.c 同样在~目录下执行 find test -path "*.c" 返回值: test/src/main.c test/src/lib/util.c 4.-regex适合查找复杂路径 find test -regex ".*/202[0-9][0-9]+\.log" 返回 test/20250710.log

根据文件类型查找

find [查找路径] -type [文件类型]
文件类型可以是以下值:

  • f普通文件
  • d目录,当前目录也将作为查找结果返回
  • l符号链接文件,使用了-L选项时,由于会追踪链接文件,因此遍历到的文件都是源文件,此时-type l将只能匹配到断开的链接文件
  • p 命名管道
  • b 块设备(缓冲)文件
  • c 字符设备(无缓冲)文件
  • s 套间字文件socket
1.查找/etc目录下的所有普通文件 find /etc -type f 2.查找/test目录下的所有目录 find /test -type d test目录为空时,返回结果也有.或/test表示当前目录,如果只需要当前目录下的子目录,需要通过-mindepth 1指定搜索深度

处理符号链接

  • -lname “pattern”查找符号链接
  • -ilname “pattern”查找符号链接(不区分大小写)
  • 以下选项是全局选项,会影响find命令的路径解析方式,必须在查找路径之前指定
  • -P不跟随符号链接(默认),不访问其指向的实际目录或文件,直接处理链接本身
  • -H只跟随命令行所指定路径中的符号链接,如果后续遍历该路径下的文件时,遇到其他符号链接,将不再跟随
  • -L跟随所有符号链接,在遍历搜索路径下的文件时,如果遇到其他符号链接,则追踪其指向。在使用了-L后,-lname和-ilname将不再匹配到任何内容,因为此时所有文件都是源文件而不再有符号链接,-type l将只能匹配到断开的符号链接
1.查找当前目录下的符号链接文件 find . -lname '*.c' 2.全局选项需要最先指定,否则报错 find -L /path/dir -name "*.txt" 3. -H只追踪命令行中给定参数的符号链接 find -H /path/dir_link -name file.txt -H只会追踪dir_link所指向的目录real_dir,如果real_dir中还有符号链接,则不会继续追踪 而-L会追踪dir_link和real_dir及目录下遇到的所有符号链接 4.-L和-type l搭配可以用来查找断开的符号链接 find -L . -type l
xtype根据符号链接的原文件类型判断

xtype是type选项的拓展,主要用于判断符号链接的源文件类型,如果当前所判断文件是非链接文件,该选项行为和type相同。如果是符号链接,则会追踪源文件,以源文件类型作为判断标准

-xtype 文件类型匹配链接文件源文件类型为指定类型的文件

  • 支持的文件类型与type选项相同,常用的有f(普通文件),d(目录),l(符号链接文件)
  • 注意:若符号链接指向无权限访问的目标,-xtype会判定为无效链接
1.列出当前目录下所有普通文件和源文件是普通文件的符号链接和硬链接文件 find /path -xtype f 2.列出所有指向普通文件的符号链接文件 find /path -type l -xtype f 3. 匹配断开或无限循环指向的符号链接,方便删除 find -P /path -xtype l -P是默认选项,因此不显式指定也行 -P选项会在命令的遍历阶段,阻止追踪链接文件,能有效防止命令因为追踪无限循环指向的符号链接直接导致报错 在匹配阶段,-xtype会开始追踪链接文件,如果符号链接指向一个不存在的文件,则回退并判断当前文件为符号链接文件 如果符号链接循环指向,无法追踪到有效文件,则回退并判断当前文件为链接文件 如果符号链接指向普通文件或目录,则由于不满足匹配类型l,不作为匹配结果输出 因此上述命令能正确找到断开或无限循环指向的符号链接

处理硬链接

  • -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
查找/path目录下大于100MiB的文件 find /path -size +100M

测试是否为空

- empty查找空文件或空目录

查找当前目录下有哪些空文件和空目录 find . -empty

根据文件所有者、所属组查找

find [起始查找路径] [选项] [用户名或组名]

  • -user 用户名:根据文件所属用户查找,不能使用用户ID作为参数
  • -uid 用户ID值n:根据文件所属用户ID值查找,值n可以使用+n或-n表示大于或小于该值的范围
  • -nouser匹配属于已销户用户的文件,如果某位用户已从系统中删除,而文件仍属于该用户,则满足匹配
  • -group 组名:根据文件所属用户组查找,允许使用用户组ID作为参数
  • -gid 用户组ID值n:根据文件所属用户组ID值查找,值n可以使用+n或-n表示大于或小于该值的范围
  • -nogroup:匹配属于已删除用户组的文件,,如果某个用户组已从系统中删除,而文件仍属于该用户组,则满足匹配
示例: # find /home -user user1 查找/home目录下属于user1用户的文件

根据文件权限查找

  • -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权限)
1.查找其他用户可写的文件(有安全风险) find /home -perm -o=w 2. 查找所有可执行文件 find /usr/bin -perm /111 3.查找有SUID权限的文件 find / -perm /4000

根据时间属性查找

find [查找路径] [选项] [时间]

按天数匹配
  • -atime 值n:根据文件上次访问时间匹配
  • -ctime 值n:根据文件元信息修改时间匹配
  • -mtime 值n:根据文件内容的修改时间匹配

上述选项用于匹配文件上次访问/修改元信息/修改文件内容是n*24小时以前的文件,时间会向下舍入,因此0表示不到24小时,1表示24-48小时之间。可以使用小数,但在值为小数时需要搭配+或-,以+n和-n形式使用(此时更推荐使用分钟数匹配)

匹配最近 12小时内修改过的文件 find /path -mtime -0.5
按分钟匹配
  • -amin 值n:根据文件访问时间匹配
  • -cmin 值n:根据文件属性被修改时间匹配
  • -mmin 值n:根据文件内容被修改时间匹配
  • 上述时间值中,使用+表示超过该时间范围,-表示小于该时间内,直接写数值表示等于,同样可以使用小数
1.查找/etc目录下5分钟内被访问过的所有文件 find /etc -amin -5 2.列出/u/bill目录下2-6分钟内访问过的文件 find /u/bill -amin +2 -amin -6
修改时间基准
  • -daystart 从当天0点作为基准,开始计算时间(默认情况下是以find命令执行时的当前时间作为基准),该选项只影响在它之后的-atime等选项,如果-atime选项在-daystart之前则不受影响
默认情况下,-atime、-amin等选项是以当前时间作为基准计算时间差,如: find . -mtime 0 用来匹配从当前时间起往前24小时内修改的文件,添加-daystart选项后 find . -daystart -mtime 0 用来匹配从今天凌晨 0 点到现在之间修改的文件 find . -daystart -mtime 1 查找“昨天0点到今天0点之间被修改”的文件
比较两个文件的时间戳

find [查找路径] -newerXY 参考文件

  • X代表搜索路径下要查找文件的时间戳类型
  • Y代表参考文件的时间戳类型
  • 如果查找路径下文件的时间戳X比参考文件时间戳Y晚,则视为true,满足匹配条件
  • X和Y可以是以下值:
    • a 上次访问时间
    • B 文件创建时间(需要文件系统支持)
    • c 文件元信息修改时间
    • m 文件内容修改时间
    • t “时间”:将查找路径下的文件时间戳与指定时间的时间戳进行比较,此时不需要再指定参考文件,时间戳来源由参考文件的访问/元信息修改/修改时间改为在命令行中明确指定,使用该参数时仅支持-newerXt形式(如:-newerat )
1.查找/var/log目录下修改时间比syslog的修改时间更晚的所有文件 find /var/log -newermm /var/log/syslog 2.查找 /home 下访问时间早于 last_access.txt 的所有文件。 find /home -type f ! -neweraa /home/user/last_access.txt 3.查找backup目录下,修改时间比last_backup.tar.gz晚的文件 这表明这些文件在上次备份后修改过,可能需要再次备份 find /backup -newermm /backup/last_backup.tar.gz
  • -anewer 参考文件:等价于-neweram,匹配访问时间比参考文件修改时间晚的文件
  • -cnewer 参考文件:等价于-newercm,匹配文件元信息修改时间比参考文件修改时间晚的文件
  • -newer 参考文件:等价于-newermm,匹配文件修改时间比参考文件修改时间晚的文件
查找长期未使用文件

find [查找路径] -used 值n查找上次访问时间是上次元信息修改时间n天后的文件,常用于查找长期未访问的文件,以进行存档或删除

指定搜索深度

  • -maxdepth N搜索深度最多为N层(所指定的搜索起始目录为0,因此-maxdepth 0将只匹配起始目录本身)
  • -mindepth N搜索深度最小为N层
  • 这两个选项是全局选项,应该放在其他选项之前,否则会抛出警告
查找/home目录下的所有子目录,不包括home目录自己 find /home -mindepth 1 -maxdepth 1 -type d

-depth优先处理目录下的内容

默认情况下,find命令在遍历到一个目录时,会先处理目录本身,然后才会进入该目录进行遍历,对目录下的内容进行处理。这种默认顺序会在删除目录或修改权限时产生错误,如:使用find /path/dir -type d -delete删除dir下的目录,并删除dir目录本身,find命令会先尝试删除dir,但会由于dir目录下有内容而删除失败,-depth会反转操作顺序,让find先删除目录下的内容,再删除母目录

-depth在处理目录本身之前处理每个目录下内容

find会首先处理目录本身,如: find /path/dir 会首先输出目录本身,再输出目录下的内容 /path/dir /path/dir/file1 如果想要删除dir下的目录 find /path/dir -name "dir" -type d -delete 会报错:Directory not empty find /path/dir -depth -type d -delete 将会正确执行,删除dir下所有空目录,最后删除dir本身 dir下的子目录需要确保事先已经删除目录下的文件,否则依旧会因为目录不是空目录而删除失败

跳过目录

-prune跳过目录,不进入之前选项所匹配的目录下进行遍历

由于该选项的作用只是不让find进入某些目录遍历,因此具体不进入哪些目录需要通过其他选项来指定,但在搭配了其他选项时,这些选项又会将遍历结果筛选得只剩下满足要求的目录,同时-prune又禁止进入这些目录遍历,在组合搭配下,最后结果将只剩下前置选项匹配的目录本身。因此该选项通常需要搭配-o选项使用,来避免前置选项在-prune选项之前就筛选掉不需要跳过的目录,常用语法为:
find [搜索路径] -name “要排除的目录名” -prune -o [其他条件] -print

  • -name可以任意替换为其他选项
  • -prune只对它之前的一个选项有效,要跳过多个选项的目录需要使用分组实现,参考以下示例
1.要跳过哪些目录需要通过其他选项指定 如:输出除了backup目录以外的所有文件和目录 如果直接执行 find . -name "backup" -prune 由于-name "backup"会将结果筛选得只剩backup目录 而-prune选项会禁止find进入backup遍历,这将导致删除结果只剩下 ./backup 正确的执行方法是: -name "backup"跳过,其他目录print find . -name "backup" -prune -o -print 2.跳过多个src和backup目录 find . \( -name "src" -o -name "backup" \) -prune -o -print

-noleaf禁用基于硬链接的优化

在unix文件系统中,每个目录至少会有两个硬链接:指向自己的目录项.目录名(父目录对它的引用),此外,该目录下每增加一个子目录就会为其增加一个硬链接..(在子目录创建时自动添加以指向父目录)

默认情况下,find命令会利用上述机制优化遍历操作,如果一个目录的硬链接数为2,意味着该目录下没有子目录(它是叶子目录),find将不会递归地搜索子目录以加快搜索(但find依旧会进入该目录搜索普通文件)。如果硬链接数大于2,则find会递归地搜索子目录。这一机制会导致find在搜索一些非unix文件系统时,错误地跳过一些目录的子目录,因为这些文件系统不一定维护和依赖硬链接,当系统中挂载了虚拟文件系统或网络文件系统,且需要使用find在这些文件系统中执行搜索时,需要禁用上述优化机制:

find [搜索路径] -noleaf [其他选项]禁用基于硬链接的叶目录判断机制,严格遍历所有文件

find /mnt/cdrom -noleaf -name "*.txt"

基于文件系统搜索

  • -xdev 仅搜索当前文件系统,不跨越挂载点,当前的文件系统指搜索路径所处的文件系统,常用于对USB等设备的遍历查找
  • -mount (旧版本语法)功能同上
  • -fstype 文件系统:手动指定要搜索的文件系统类型,常用值有:autofs,ext3,ext4,nfs,proc,sshfs,sysfs,ufs,tmpfs,xfs,如果该选项指定文件系统与搜索路径所处文件系统不一致,则匹配结果为空

逻辑运算

命令分组

用于组合命令,()必须用\转义或加引号

  • (expr)指定优先运算
查找1天内修改过的.txt或.sh文件 find . \( -name "*.txt" -o -name "*.sh" \) -a -mtime -1 如果不加括号 find . -name "*.txt" -o -name "*.sh" -a -mtime -1 上述命令按顺序会被解析为: find . -name "*.txt" -o \( -name "*.sh" -a -mtime -1 \) 匹配所有.txt文件或1天内修改过的.sh文件
逻辑非

排除满足匹配条件的文件

  • ! expr逻辑非
  • -not expr逻辑非
查找当前目录下所有不属于root用户的文件 find . ! -user root
逻辑与

默认逻辑,-a和-and可省略,匹配同时满足多个条件的文件,短路运算,如果expr1为false,则不再尝试匹配expr2

  • expr1 expr2逻辑与
  • expr1 -a expr2逻辑与
  • expr1 -and expr2逻辑与
查找大于100MB而小于200MB的文件 find /etc -size +100MB -a -size -200MB
逻辑或

查找满足任意一个条件的文件,如果expr1为true,则不会计算 expr2

  • expr1 -o expr2逻辑或
  • expr1 -or expr2逻辑或
查找.txt或.log文件 find . -name "*.txt" -o -name "*.log"
逗号运算符
  • expr1,expr2

expr1和expr2都会依次执行,不会短路。既不会像逻辑与一样如果前一个失败,后一个不执行,也不会像逻辑或一样如果前一个成功,后一个不执行。由于find的默认逻辑是多个选项之间的与运算,因此往往需要用该表达式执行不受前者影响的连续操作

输出要删除的文件并执行删除 find . -name "*.tmp" -exec echo "Deleting:" {} \; , -delete
常量true与false
  • -true永远返回true
  • -false永远返回false

匹配文件后执行操作

find命令支持在匹配到文件后直接执行打印、删除等操作,默认情况下,所指定的操作只会对前一个匹配条件生效,因此在指定多个匹配条件时,往往需要搭配()来指定操作命令

查找所有.txt文件和.log文件,并按指定形式输出 find . \( -name "*.txt" -or -name "*.log" \) -printf "%f-----%s\n" 如果没有(),则printf语句只对-name "*.log"生效
打印文件名
  • -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至今的秒数
%A,%B,%C,%T指定时间格式时,不需要%号,且不支持连续的时间格式 1.%AY 会输出文件上次访问的年 2.不支持连续指定时间格式 %AYmd会输出 2021md 3.输出年月日等多个信息需要反复使用%A find . -name "file1.txt" -printf "%f---%AY%Am%Ad\n" 输出: file1.txt---20210712
详细打印文件信息
  • -ls详细列出匹配到的文件,输出结果类似于”ls -dils”命令执行结果
  • -fls 文件名:将-ls的输出写入指定文件,工作方式与fprint类似
输出示例: 394305 92 -rw-r--r-- 1 root root 86081 Jul 7 13:09 ./caves.log 输出字段依次是: 文件inode,文件占用磁盘块数,权限,硬链接数,文件所属用户,文件所属组,文件大小(bytes为单位),文件上次修改时间,文件名
-quit立即退出

-quit 在匹配到一个结果并执行完-quit选项之前的操作后立即退出,不再继续遍历,用于快速找到一个结果后提前结束搜索

1.添加了-quit选项的find将不再默认执行-print,因此需要手动执行-print find . -name "file*" -print -quit 在找到file1.txt并打印后会退出,即便当前目录下有file2,file3
对找到文件的执行其他命令
  • -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及其所指定的命令时拒绝执行命令并报错

风险案例: 假设有以下文件 test |___src  |_____file.txt  |_____ ls(恶意程序) 文件ls的内容为: #!/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后所指定的命令,然后退出

示例: # find /etc -name init* -a -type f -exec ls -l {} \; 找到/etc目录下所有init开头的文件并列出具体文件信息 # find /home -size +100MB -a -user user1 -ok rm {} \; 找到/home目录下属于user1用户且大于100MB的文件,然后依次询问是否删除找到的文件

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 文件名 原来查看压缩过的文本文件内容
e.g.可以在命令中指定多个文件名,或使用通配符一次压缩多个文件,每个文件单独生成一个.gz压缩文件 $ gzip my* #压缩所有my开头的文件

文件的打包、压缩与解压(.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 -cvf test1.tar test1 打包test1文件夹中文件为test1.tar文件,并显示详细信息 # tar -zcf test.tar.gz test1 打包并压缩test1文件夹为test.tar.gz
解压

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格式

上一篇:Linux文件系统与文件类型
下一篇:Linux 系统与信息
z z z z z