我在理解这个 Linux 命令的含义时遇到了困难:
du -sk * | sort -rn | head
我知道 du 用于显示磁盘使用情况,但我在理解命令的其余部分时遇到了困难。有人可以解释一下这里到底发生了什么吗?还可以建议一些好的资源来详细研究复杂的linux命令吗?
答案1
a | b | c
运行a
,b
并c
同时在单独的进程中运行,其中一个命令的标准输出通过管道连接到下一个命令的标准输入。
这a
是du -sk *
。*
由 shell 扩展为当前目录中按词法排序的非隐藏文件的名称(如果没有非隐藏文件,则要么因错误中止命令,要么*
根据 shell 扩展为文字)。
在这里,如果任何文件的名称以 开头-
,则该文件将被视为选项du
,因此正确的语法是:du -sk -- *
,确保--
其后面的任何内容都不会被视为选项。
-k
是获取以千字节为单位的磁盘使用情况(1024 字节,标准du
实现中默认为 512 字节单位)。-s
是总结每个文件的磁盘使用情况(对于那些类型目录,它没有给出所有子目录的详细信息)。
因此,它将打印当前目录中所有非隐藏文件的磁盘使用情况(目录类型的累积),并在同一行上显示千字节数,后跟文件名(但要注意文件名可能由多于一行)。
对于许多du
实现,如果某些参数引用相同的文件(硬链接)或在多个目录中找到相同的文件,则仅在输出中考虑第一次出现的磁盘使用情况。
sort -rn
sort
是线其输入的数字n
反过来r
,因此假设所有文件名都不包含换行符,则会将文件/目录从最大到最小进行排序(根据磁盘使用情况)。
head
( 的缩写head -n 10
) 丢弃 的输出中除前 10 行之外的所有内容sort
。
一个更正确的版本,这些实用程序的 GNU 实现是:
du -skl0 ./* | sort -zk1,1rn | head -z | tr '\0' '\n'
其中-l
强制所有硬链接都被考虑在内,-0
/-z
输出/进程记录以NUL分隔,因此它对于包含换行符的文件名效果更好(并且前缀./
可以指示每个文件名在输出中的起始位置,对于那些包含换行符的文件名除了避免以-
) 开头的文件名出现问题之外;使用sort -k1,1rn
而不是sort -rn
更改关系(具有相同磁盘使用情况的两个文件)时的行为,避免按词法反向对关系进行排序。
1 对于 GNU du
,默认值是千字节,但可以用环境变量覆盖,包括POSIXLY_CORRECT
, DU_BLOCK_SIZE
, BLOCK_SIZE
,BLOCKSIZE
答案2
它使用管道结构,允许一个命令的输出作为以下命令的输入。
du -sk * |sort -rn|head
启动 3 个命令
du -sk *
du
它运行以千字节 ( ) 为单位的磁盘使用命令输出-k
,包括子目录,仅输出小计 ( -s
) 作为输入发送到
sort -rn
它将排序,将每个行键视为数字,按相反顺序(降序),输出发送到下一个命令。
head
默认情况下仅输出前 10 行。