L o a d i n g . . .
SHIWIVI-文章

//sunny forever
while(life<end){
love++;
beAwesome :)}

    <
  • 主题:
  • + -
  • 清除背景
  • 禁用背景
目 录
  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)
    5. 2.5. rm删除文件与目录(remove)
    6. 2.6. shred覆盖与删除文件
    7. 2.7. unlink删除文件
    8. 2.8. cp复制文件或目录(copy)
    9. 2.9. dd按指定块大小复制和处理文件
    10. 2.10. install复制程序文件
    11. 2.11. mv移动文件与重命名(move)
  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. 以指定格式打开文件
      1. 3.3.1. od以指定进制打开文件(octal dump)
      2. 3.3.2. base64解码与编码文件
      3. 3.3.3. basenc多格式解码与编码文件
    4. 3.4. 格式化输出内容
      1. 3.4.1. fmt格式化行(format)
      2. 3.4.2. pr文件分页与打印(print)
      3. 3.4.3. fold强制文本行换行
      4. 3.4.4. split文件拆分
      5. 3.4.5. csplit按内容拆分文件
    5. 3.5. 合并文件
      1. 3.5.1. paste合并文件
      2. 3.5.2. join 按字段合并文件
    6. 3.6. comm逐行比较两个排序好的文件
    7. 3.7. 文件校验
      1. 3.7.1. sum计算文件占用的磁盘块数与校验和
      2. 3.7.2. cksum计算文件校验和
      3. 3.7.3. md5/b2/sha1校验文件
    8. 3.8. file查看文件类型
    9. 3.9. sync将缓存写入磁盘
    10. 3.10. truncate扩大或缩小文件大小
  4. 4. 处理文件路径
    1. 4.1. basename提取文件名
    2. 4.2. dirname提取路径
    3. 4.3. pathchk检查文件名是否有效
    4. 4.4. realpath获取绝对路径与相对路径
  5. 5. 文件查找
    1. 5.1. find文件查找
      1. 5.1.1. 1. 根据文件名查找
      2. 5.1.2. 2. 根据文件大小查找
      3. 5.1.3. 3. 根据文件所有者、所属组查找
      4. 5.1.4. 4. 根据时间属性查找
      5. 5.1.5. 5. 根据文件类型查找
      6. 5.1.6. 6. 多个条件同时查找
      7. 5.1.7. 7. 对找到文件的执行其他命令
      8. 5.1.8. 根据i节点查找
    2. 5.2. locate
  6. 6. 链接文件
    1. 6.1. link创建硬链接
    2. 6.2. ln创建链接文件
    3. 6.3. readlink查看软链接的源文件
  7. 7. 管道文件
    1. 7.1. 匿名管道
    2. 7.2. mkfifo创建命名管道(管道文件)
    3. 7.3. mknod创建设备文件或管道文件
  8. 8. 临时文件
    1. 8.1. 创建临时文件
    2. 8.2. 临时文件的清理
    3. 8.3. 脚本中临时文件的使用
  9. 9. 帮助文件 (manual)
    1. 9.1. 1. 查看完整帮助man
    2. 9.2. 2. 查看简短帮助
    3. 9.3. 3. 查看命令的选项
    4. 9.4. 4. 查看shell内置命令

Linux文件操作

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

查看文件与目录信息

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 每成功删除一个目录就打印其消息

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 “字符串”:备份文件时使用指定的字符串作为文件后缀名
  • -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=值:指定块数量
  • iflag=值:按照指定要求访问输入文件,可取值参考oflag的取值
  • oflag=值:按照指定要求访问输出文件,值可以为:
    • append 以附加形似写入文件,这样即使其他进程正在写入此文件,dd 命令也会将其附加到文件的当前内容,只对oflag有效
    • direct 通过I/O直接读取或写入数据,而不使用缓冲区
    • noatime 不更新文件的访问时间戳
      更多标志参考GNU文档
从/dev/zero文件读取数据,清空磁盘或分区 dd if=/dev/zero of=/dev/sda bs=1M 2. 测试磁盘读写速度 dd if=/dev/zero of=testfile bs=1G count=1 oflag=direct

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 移动文件前打印每个文件的名字

文件操作

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

以指定格式打开文件

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]…

  • 默认情况下,该命令会将多个文件的第一行都粘贴到第一行,第二行都粘贴到第二行,以此类推,同一行内容之间使用tab分隔
  • -s 将文件1的内容都粘贴到第一行,文件2内容粘贴到第二行,以此类推
  • -d “字符1字符2..”:使用指定的字符作为内容分隔符,可以指定多个字符,文件合并后的内容将写为:文件1字符1文件2字符2
e.g.文件num.txt内容为 1111 2222 3333 文件test.txt内容为 AAAA BBBB 1. 合并文件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_
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文件查找

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

1. 根据文件名查找

find [查找路径] [参数] [文件名]

  • -name 根据文件名查找
  • -iname 根据文件名查找(文件名不区分大小写)
  • 搜索范围应尽可能小,尽量避免在根目录下搜索
  • 只使用文件名为精确搜索,可以使用通配符(*匹配任意数量字符,一个?匹配一个字符)来模糊查找
    示例: # find /etc -name init 在/etc目录下查找init文件 # find /etc -name *init* 在/etc目录下查找所有文件名带init的文件 # find /etc -name init??? 在/etc目录下查找所有文件名init开头,后面跟3个字符的文件
2. 根据文件大小查找

find [查找路径] [参数] [文件大小]

  • -size  根据文件大小查找
  • 文件大小中,可以使用+表示大于,-表示小于,直接写数值表示等于
    示例: # find / -size +100M 查找服务器中大于100MiB的文件
3. 根据文件所有者、所属组查找

find [查找路径] [参数] [用户名或组名]

  • -user  根据根据文件所属用户查找
  • -group 根据文件所属组查找
    示例: # find /home -user shw 查找/home目录下属于shw用户的文件
4. 根据时间属性查找

find [查找路径] [参数] [时间]

  • -amin  根据根据文件访问时间
  • -cmin  根据文件属性被修改时间
  • -mmin  根据文件内容被修改时间
  • 时间参数中,使用+表示超过该时间范围,-表示小于该时间内,直接写数值表示等于
    示例: # find /etc -amin -5 查找/etc目录下5分钟内被访问过的所有文件
5. 根据文件类型查找

find [查找路径] -type [文件类型]

  • f  文件
  • d  目录
  • l  链接文件
    示例: # find /etc -type f 查找/etc目录下的所有普通文件
6. 多个条件同时查找

如果需要查找同时满足多个条件的文件,可以添加下面的参数

  • -a  两个条件同时满足
  • -o  两个条件任意满足一个
    示例: # find /etc -size +100MB -a -size -200MB 查找大于100MB而小于200MB的文件
7. 对找到文件的执行其他命令

如果在找到文件后需要对其进行相应操作,可以添加下述命令

  • -exec 命令 {};  找到文件后直接执行命令
  • -ok 命令 {};  找到文件后会每个文件逐一询问是否执行命令
    示例: # find /etc -name init* -a -type f -exec ls -l {} \; 找到/etc目录下所有init开头的文件并列出具体文件信息 # find /home -size +100MB -a -user shw -ok rm {} \; 找到/home目录下属于shw用户且大于100MB的文件,然后依次询问是否删除找到的文件
根据i节点查找

find [查找路径] -inum i节点值
在知道某文件i节点值的情况下根据i节点查找,如:用于查找某个文件的硬链接(文件i节点值与文件硬链接i节点值相同)

locate

locate为一个文件查找工具,可以从yum源安装
find命令为在指定目录下遍历查找,会占用大量系统资源,而且查找速度较慢,locate会建立文件资料库,然后在资料库中查找,反应速度快。
locate [-i] 文件名

  • -i 不区分大小写
  • locate会定期更新资料库,但实时新建的文件可能会找不到,可以在root下使用 updatedb 命令手动更新资料库
  • locate 不会将/tmp等临时缓存文件收录到资料库中,因此临时文件使用locate找不到

链接文件

链接文件是Linux文件系统的一个优势。当需要在系统上维护同一文件的两份或多份副本时,除了保存多份单独的物理文件副本之外(复制文件),还可以采用保存一份物理文件副本和多个虚拟副本的方法(链接文件),这种虚拟的副本就称为链接。Linux文件系统有两种链接文件:

  • 软链接:也称为符号链接或软连接,相当于文件的快捷方式。为了方便跨分区指向,软链接文件拥有独立的inode号,是一个单独的文件,但文件本身只包含指向原文件或原目录的路径,而不包含实际的文件内容,所有对软链接的读取、执行等操作都是基于原文件。当原文件删除,软链接文件也将失效,因此可视为软链接只是一个指向原文件的指针
  • 硬链接:是一个被创建出来的独立虚拟文件,其中包含了原文件的信息及位置。但是硬链接文件和原文件本质上是同一个文件,inode号相同,删除原文件并不会造成硬链接文件的失效,也不会造成文件内容丢失,因为此时仍然还存在一个可以访问文件存储区域的通道(硬链接文件)

二者区别:

  • 生成的软链接权限都为 rwxrwxrwx,实际权限取决于原文件权限
  • 硬链接文件 inode 节点与原文件相同,软链接不同
  • 硬链接指向不能跨分区,软链接可以
  • 不能给目录生成硬链接,软链接可以

inode(索引节点):是Linux文件系统中的一个概念,用于存储文件的元数据信息。每个文件在文件系统中都有一个对应的inode,它包含了文件的具体信息,如文件类型、文件大小、权限信息、所有者、访问时间、修改时间、链接数等。在Linux文件系统中,文件内容被存储于数据块中,而inode存储了文件的元数据信息和指向文件数据块的指针。当用户创建一个文件时,系统会分配一个inode给这个文件,并记录文件的元数据信息。每个inode都有一个唯一的索引号,即文件或目录的inode编号,它是一个用于标识的唯一数字,这个数字由内核分配给文件系统中的每一个对象。要查看文件或目录的inode编号,可以使用ls -i命令,文件系统可以通过该索引号来找到对应的inode和文件。硬链接文件和源文件共享相同的inode,即它们指向同一个文件的元数据信息,因此在inode中会有一个链接计数器,记录有多少个目录项指向这个inode,这样系统可以正确处理不同目录下的链接关系。

对于硬链接,硬链接和原始文件本质上是同一个文件,它们共享相同的inode。当用户创建一个硬链接时,实际上是在创建一个指向相同inode的新目录项,使得该文件在文件系统中有多个名称。因此,删除源文件时,不会影响到已经创建的硬链接文件,因为这其实只是减少了一个指向该inode的目录项,而硬链接文件依然指向这个inode,因此硬链接文件会继续存在。只有当所有指向该inode的目录项都被删除后,文件系统才会释放该inode及其对应的数据块,这时硬链接文件也会被删除。

对于软链接(Symbolic Link),它是一个特殊的文件,用于指向另一个文件的路径。和硬链接不同,软链接创建了一个新的inode来存储软链接文件的元数据信息。软链接和原始文件是两个独立的文件,它们可能位于不同的文件系统中。因此,软链接需要有自己的inode来存储自己的元数据信息,以确保其独立性。软链接的实现方式是通过存储目标文件的路径信息,而不是直接指向目标文件的inode。这样做的好处是可以在文件系统中创建指向不同文件系统的软链接,而硬链接只能在同一文件系统中有效。软链接文件的存储内容是指向另一个文件的路径,而不是具体的文件内容,因此即便源文件很大,软链接文件依旧可能很小。而所有通过vim等软件修改软链接内容,实际是在修改源文件的内容,所有对软链接的读取、执行等操作都会基于源文件,软链接只是一个指向源文件的指针,当源文件删除,软链接文件也将失效。

link创建硬链接

该命令只能创建硬链接
link 源文件 硬链接名

ln创建链接文件

ln 源文件 目标文件

  • 默认会创建硬链接,如果指定路径下已有与目标文件同名的文件,则返回错误
  • -s 创建软链接
  • -b 创建链接时如果已有同名文件,则备份该文件,参考通用的备份方案
  • -S “字符串”:指定备份文件的后缀名
  • -f 强制创建链接文件,有同名文件直接覆盖
  • -i 有同名文件时,询问用户是否覆盖
  • -v 打印每个创建链接的文件名
  • -L 当源文件是软链接文件时,创建的新链接指向该软链接所指向的文件,该选项会创建硬链接
  • -P 当源文件是软链接文件时,创建的新链接指向该软链接本身(默认)
  • -r 创建基于相对路径(默认为绝对路径)的软链接,这在目录结构整体发生移动时,链接仍然有效,该选项需要搭配-s选项
示例: # ln /etc/issue /tmp/issue.hard 为/etc/issue创建硬链接 # ln -s /etc/issue /tmp/issue.soft 为/etc/issue创建软链接

readlink查看软链接的源文件

readlink [选项] 文件名 查看软链接所指向的实际文件路径

  • 默认情况下,命令会直接输出符号链接文件本身所存储的源文件的文件路径,这个路径可能是绝对路径,也可能是相对路径,这取决于软链接创建时的选项
  • -f 输出符号链接所指向的文件或目录的绝对路径。如果符号链接指向另一个符号链接,则会继续解析直到找到最终的源文件或目录。即使路径中的某些目录或文件不存在(这些文件未来可能会由其他程序创建),也返回该路径而不报错
  • -e 输出符号链接所指向的文件或目录的绝对路径,这些路径必须是存在的,否则返回空并报错,该选项适用于要保证整个路径都真实存在的情况
  • -m 类似于-m选项,如果路径中的某个目录或文件不存在,命令会直接将其视为目录,然后返回完整的绝对路径
  • -n 输出的路径末尾不添加换行符,方便与其他命令结合使用
  • -s或-q 静默模式,禁止显示大多数错误消息(默认)
  • -v 输出错误消息

管道文件

管道(pipe)是一种在不同进程之间进行数据传输的通信机制,它允许一个进程写入数据,另一个进程按顺序读取数据,从而实现进程间的通信。管道中的数据是以”流”的形式进行传输,管道的使用能够有效地实现数据流的连接,使得用户能够将多个命令串联起来,形成一个复杂的命令执行流程。管道通信有以下特点:

  • 先进先出:先写入的数据会被先读取,遵循”First In, First Out”原则。
  • 双进程通信:管道允许两个进程之间进行数据传输,一个进程写入数据,另一个(或多个)进程读取数据,读与写可以同步进行
  • 流式数据:管道中的数据被存储于内存的内核缓冲区,数据是一次性传输的,被读取一次后就会消失,是一种流式数据
  • 阻塞行为:为了保证进程间数据传输的有序性和同步性,管道通过阻塞读写操作来协调数据的传输。进程在写入数据时,如果缓冲区已满,进程的写入操作会被阻塞,直到另一个进程从管道中读取数据,腾出缓冲区空间,写操作才会继续。类似的,读操作也会被阻塞,当进程从管道中读取数据时,如果缓冲区为空,进程的读操作会被阻塞,直到有数据写入。如果写入进程已经终止(写端关闭),且管道内的数据已被读完,则读操作会立即返回EOF(End Of File),表示管道结束。

匿名管道

匿名管道的创建完全基于内存,不会在文件系统中生成任何文件或路径,在创建时不分配名称,它只能在有关系的进程(如父子进程)间使用,而不能在任意进程之间通信。匿名管道的生命周期与创建它的进程相关,当创建这个管道的进程结束时,管道也会被关闭,匿名管道只能通过文件描述符来访问。

在C语言中,可以使用系统调用pipe()来创建匿名管道,在命令行中使用管道符|创建的也是匿名管道,此时shell会创建子shell,管道符两侧的命令都将在独立的子shell中并行执行,虽然子shell中运行的命令是独立的进程,但他们是在同一个父shell上下文中执行的,因此它们可以通过管道完成通信。

mkfifo创建命名管道(管道文件)

命名管道(named pipes)通常被直接称为FIFO(First In, First Out的缩写),它会被显式地创建在文件系统中,称为管道文件。管道文件是一种特殊的文件,它虽然在文件系统中拥有文件路径,但数据的存储位置依旧位于内存缓冲区,管道文件本身并不存储数据,管道文件可以通过以下命令创建:

mkfifo [选项] 文件名

  • -m 权限:为创建的管道文件指定权限,接收的参数支持权限的八进制值表示形式(如755),也支持符号模式(如:移除组的写权限g-w,默认为a=rw,即允许所有人读写,可以基于此权限进行删减)

mknod创建设备文件或管道文件

该命令用于让用户手动创建特殊文件,比如字符设备、块设备以及命名管道

mknod [选项] 文件名 文件类型 [参数]

  • -m 权限:为创建的管道文件指定权限,接收的参数支持权限的八进制值表示形式(如755),也支持符号模式(如:移除组的写权限g-w,默认为a=rw,即允许所有人读写,可以基于此权限进行删减)
  • 文件类型有:p(命名管道文件)、c(字符设备文件,如:键盘设备)、b(块设备文件,如:U盘设备)
1.创建一个命名管道文件 mknod newpipe p 2.创建块设备文件 mknod /dev/myblockdevice b 8 1 #8是主设备号,1是次设备号

临时文件

Linux系统提供了一个特殊的目录/tmp,用于存放临时文件。大多数Linux发行版会在系统在启动时自动删除tmp目录下的所有文件,或会周期性清理长期不访问的临时文件,且系统上的任何用户账户都有权限读写tmp目录中的文件,这为用户创建临时文件提供了便利,且不用担心清理工作

创建临时文件

mktemp [选项] [文件名模版.XXXXXX]
  • 使用该命令时,通常会指定一个文件名模板,文件名模板末尾必须包含至少3个(通常6个)X(必须为大写X),mktemp命令在创建该文件时会使用随机字符替换X,以保证临时文件的唯一性。默认情况下,如果文件名模板前未指定路径,命令会在当前目录中创建临时文件或目录,如果指定了路径,则前往指定路径下创建
  • 如果不指定文件名模板,命令将使用默认模板’tmp.XXXXXXXXXX’(10个随机字符),且默认会在/tmp目录下创建临时文件,而不管当前路径如何
  • -p 路径:在指定路径下创建临时文件或目录
  • -t 在 $TMPDIR 环境变量指定的目录中创建文件或目录。如果未设置 $TMPDIR,则在/tmp路径下生成临时文件或目录,返回完整路径名
  • -d 创建临时目录
  • -q 在无法创建临时文件或目录时不产生错误信息
  • -‌-suffix=”字符串”:为生成的文件添加指定后缀
1.在当前目录下创建临时文件 $ mktemp testing.XXXXXX test.Oa6cx4 2. 在tmp目录下创建临时文件,会返回完整路径 $ mktemp -t testing.XXXXXX /tmp/test.Nhy8Ym

临时文件的清理

Linux中的临时文件主要位于两个路径下:

  • /tmp:用于存放短期临时文件
  • /var/tmp:用于存放长期的临时文件,默认情况下,文件可能保留30天或更久

大多数现代Linux发行版使用systemd-tmpfiles来管理临时文件,部分系统可能使用cron定时任务来进行清理。systemd-tmpfiles的配置文件通常位于/usr/lib/tmpfiles.d/tmp.conf/etc/tmpfiles.d/路径下。如:配置文件 /usr/lib/tmpfiles.d/tmp.conf 中的内容可能如下:

# Clear tmp directories separately, to make them easier to override D /tmp 1777 root root 10d D /var/tmp 1777 root root 30d

该配置表示:

  • /tmp 目录中超过 10 天未被访问的文件会被清理
  • /var/tmp 目录中超过 30 天未被访问的文件会被清理

脚本中临时文件的使用

在脚本中创建临时文件时,使用touch、echo等命令创建临时文件有可能带来文件名冲突等问题,且所创建的文件容易受到符号链接攻击,使用mktemp命令创建临时文件是一种更安全的推荐方法

#!/bin/bash # 创建一个临时文件 tempfile=$(mktemp myfile.XXXXXX) ... # 脚本功能 ... # 在脚本退出时删除临时文件 trap "rm -rf $tempdir" EXIT

帮助文件 (manual)

1. 查看完整帮助man

man [命令或配置文件]

  • 查看配置文件的帮助时,直接写文件名,不能加上文件路径,使用文件路径会直接显示文件内容而不是该配置文件的使用说明

man命令返回的手册页一般包括以下信息,但不一定包括所有节,信息通过分页程序显示,分页程序可以通过PageUpPageDown或空格上下翻页,也可以通过上下方向键逐行滚动,或者使用回车键逐行向下查看,查看完毕后可以通过q键退出

内容
Name 显示命令名和一段简短的描述
Synopsis 命令的语法
Confi guration 命令配置信息
Description 命令的一般性描述
Options 命令选项描述
Exit Status 命令的退出状态指示
Return Value 命令的返回值
Errors 命令的错误消息
Environment 描述所使用的环境变量
Files 命令用到的文件
Versions 命令的版本信息
Conforming To 命名所遵从的标准
Notes 其他有帮助的资料
Bugs 提供提交bug的途径
Example 展示命令的用法
Authors 命令开发人员的信息
Copyright 命令源代码的版权状况
See Also 与该命令类型的其他命令

对于命令,man 有多个不同类型的帮助文档,并使用数字区分这些区域(通常为1-9),可以使用 whereis 命令查看该命令在man目录下有几种类型,如果有多个类型,可以使用man [值] [命令]来查看对应帮助。如:1为通常为解释该命令如何使用,5通常为命令对应的说明文档如何阅读。即:使用man 命令man 1 命令为查看命令的帮助,man 5 命令为查看命令说明文档的帮助(具体区域号视命令而定),以下为不同类型内容所包含的内容

区域号 所含内容
1 用户命令和可执行程序的帮助手册
2 系统调用和内核函数的帮助手册
3 C库函数的帮助手册
4 设备文件和特殊文件的帮助手册
5 配置文件的格式和约定的帮助手册
6 游戏的帮助手册
7 杂项(如宏包、约定等)的帮助手册
8 系统管理员手册和管理命令的帮助手册
9 内核例程的帮助手册

2. 查看简短帮助

  • what 命令 只显示命令帮助文档中NAME部分的内容
  • apropos 配置文件 简短查看配置文件作用

3. 查看命令的选项

只查看命令的可选参数选项,不需要查看命令完整帮助信息

命令 --help

4. 查看shell内置命令

有些命令是bash(shell)内置命令而不是Linux的命令,使用上述命令查看不到帮助,可以使用

help 命令

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