查看文件与目录信息
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 每成功删除一个目录就打印其消息
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 “字符串”:备份文件时使用指定的字符串作为文件后缀名
- -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=值:指定块数量
- 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 移动文件前打印每个文件的名字
文件操作
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
以指定格式打开文件
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]…
- 默认情况下,该命令会将多个文件的第一行都粘贴到第一行,第二行都粘贴到第二行,以此类推,同一行内容之间使用tab分隔
- -s 将文件1的内容都粘贴到第一行,文件2内容粘贴到第二行,以此类推
- -d “字符1字符2..”:使用指定的字符作为内容分隔符,可以指定多个字符,文件合并后的内容将写为:文件1字符1文件2字符2
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文件查找
文件查找会占用大量的系统资源,尽量避免在系统使用高峰期使用文件查找命令,文件查找范围应该尽可能小。
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选项
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盘设备)
临时文件
Linux系统提供了一个特殊的目录/tmp,用于存放临时文件。大多数Linux发行版会在系统在启动时自动删除tmp目录下的所有文件,或会周期性清理长期不访问的临时文件,且系统上的任何用户账户都有权限读写tmp目录中的文件,这为用户创建临时文件提供了便利,且不用担心清理工作
创建临时文件
- 使用该命令时,通常会指定一个文件名模板,文件名模板末尾必须包含至少3个(通常6个)X(必须为大写X),mktemp命令在创建该文件时会使用随机字符替换X,以保证临时文件的唯一性。默认情况下,如果文件名模板前未指定路径,命令会在当前目录中创建临时文件或目录,如果指定了路径,则前往指定路径下创建
- 如果不指定文件名模板,命令将使用默认模板’tmp.XXXXXXXXXX’(10个随机字符),且默认会在/tmp目录下创建临时文件,而不管当前路径如何
- -p 路径:在指定路径下创建临时文件或目录
- -t 在 $TMPDIR 环境变量指定的目录中创建文件或目录。如果未设置 $TMPDIR,则在/tmp路径下生成临时文件或目录,返回完整路径名
- -d 创建临时目录
- -q 在无法创建临时文件或目录时不产生错误信息
- --suffix=”字符串”:为生成的文件添加指定后缀
临时文件的清理
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 中的内容可能如下:
该配置表示:
- /tmp 目录中超过 10 天未被访问的文件会被清理
- /var/tmp 目录中超过 30 天未被访问的文件会被清理
脚本中临时文件的使用
在脚本中创建临时文件时,使用touch、echo等命令创建临时文件有可能带来文件名冲突等问题,且所创建的文件容易受到符号链接攻击,使用mktemp命令创建临时文件是一种更安全的推荐方法
帮助文件 (manual)
1. 查看完整帮助man
man [命令或配置文件]
- 查看配置文件的帮助时,直接写文件名,不能加上文件路径,使用文件路径会直接显示文件内容而不是该配置文件的使用说明
man命令返回的手册页一般包括以下信息,但不一定包括所有节,信息通过分页程序显示,分页程序可以通过PageUp和PageDown或空格上下翻页,也可以通过上下方向键逐行滚动,或者使用回车键逐行向下查看,查看完毕后可以通过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 命令