linux中按大小排序的通用工具,了解常用单位后缀

blu*_*ast 0 linux size disk-usage sort

我可以按大小订购文件/目录列表:

ls -lS
Run Code Online (Sandbox Code Playgroud)

但是,如果我du以人类可读的格式使用:

du --max-depth=1 -h .
Run Code Online (Sandbox Code Playgroud)

我得到:

128K    ./something
3,3M    ./more
3,2M    ./even-more
...
Run Code Online (Sandbox Code Playgroud)

哪个没有订购。是否有任何标准工具可以订购此类数据?标准sort似乎不支持这一点。我需要自己滚动吗?

Sté*_*las 6

GNUsort有一个-h/--human-numeric-sort选项和h排序键标志来处理这些(它期望基于 1024 个单位(1K 之前的 1023 个排序),这恰好也是 GNU 的du计数方式。

现在请注意,使用 时会丢失一些精度du -h,因此顺序可能最终是错误的:

$ du -k a b
1212    a
1208    b
$ du -h a b | sort -h
1.2M    a
1.2M    b
Run Code Online (Sandbox Code Playgroud)

正如@StephenKitt 所提到的,您可以通过告诉du您完全精度并仅在使用例如 GNU 进行排序后转换为人类格式来解决它numfmt:

$ du --block-size=1 a b | sort -n | numfmt --to=iec
1.2M b
1.2M a
Run Code Online (Sandbox Code Playgroud)

(注意间距受到影响)。以上所有假设文件名不包含换行符。

至于关于按大小排序的一般问题,zsh globs 有一个oLglob 限定符(请注意,它是按大小,而不是磁盘使用情况)。

ls -S可以这样做(与GNUls其-U为未排序):

ls -ldU -- *(oL)
Run Code Online (Sandbox Code Playgroud)

在符号链接解析后按大小排序:

ls -LldU -- *(-oL)
wc -c -- *(-oL)
Run Code Online (Sandbox Code Playgroud)