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