sort 命令中的 KEYDEF 在哪里?

sort 命令中的 KEYDEF 在哪里?

我需要在各种情况下按文件或文件夹名称、文件大小或上次修改时间对“du”命令的结果进行排序,并附加“|” “du”命令之后的 sort -k 2' 命令按文件夹名称对结果进行排序,这是我从这个问题中了解到的。 使用 du 命令按文件名排序

在sort命令手册(RHEL 7.6)中,写着-k, --key=KEYDEF 通过键排序; KEYDEF 给出位置和类型 KEYDEF 是 F[.C][OPTS][,F[.C][OPTS]] 表示开始和停止位置,其中 F 是字段编号,C 是字段中的字符位置;

但还是不明白是什么意思。

F=2是指文件名吗?那么文件大小或最后修改时间的 F 是多少呢?那么我在哪里可以找到“KEYDEF”?

我仔细阅读了这个文档: https://www.gnu.org/software/coreutils/manual/html_node/sort-inspiration.html 但还是找不到信息。

答案1

F 是字段编号,默认情况下,该sort命令将字段定义为由空格包围的文本。 -b 和 -t 选项可以更改默认值;您引用的文档包含关于根据区域设置等指定字段分隔符的详细信息的冗长令人头痛的讨论。

您问“文件大小或上次修改时间的 F 是多少?”。sort没有文件大小或修改时间的概念。由于您的目标是过滤 的输出du,因此运行du命令并对字段进行计数。

例如,当我在du没有选项的情况下运行时,每行得到两个字段:大小和文件/目录名称:

$ du . 
8       ./ruby
4       ./nextcloud/data/nextcloud
12      ./nextcloud/data/database/nextcloud
4       ./nextcloud/data/database/performance_schema
4       ./nextcloud/data/database/mysql
... etc ...

如果您需要对当前目录下的文件和目录进行排序,du . | sort -n就可以解决这个问题,因为sort默认情况下会按第一个字段进行排序。需要 -n 选项来按数字排序而不是按字母数字排序:

$ du . | sort -n 
4       ./bitwarden/data/icon_cache
4       ./.cache/obexd
4       ./.cache/pip/wheels/2c/4a/61/5599631c1554768c6290b08c02c72d7317910374ca602ff1e5
4       ./.cache/pip/wheels/33/56/20/ebe49a5c612fffe1c5a632146b16596f9e64676768661e4e46
4       ./.cache/pip/wheels/88/a7/30/e39a54a87bcbe25308fa3ca64e8ddc75d9b3e5afa21ee32d57
4       ./.cache/pip/wheels/fc/a8/66/24d655233c757e178d45dea2de22a04c6d92766abfb741129a
... etc ...

您可以添加 -r 以先显示大文件。

按路径名排序:

du . | sort -k 2

我没有按文件名(即按路径名的最后一个组成部分)排序的快速解决方案。我认为sort单独不能做到这一点,因为您需要弄清楚哪个子字段是文件名,并且子字段编号各不相同。这是一个部分解决方案(它仅适用于包含斜杠的路径名):

$ du . | sed 's|\(.*\)/\(.*\)|\1/\2 \2|' | sort -k3
5639116 .
12      ./.cache/pip/http/9/8/7/0 0
12      ./.cache/pip/http/9/c/b/c/0 0
12      ./.cache/pip/http/c/0/4/0/0 0
12      ./.cache/pip/http/f/0/3/0 0
12      ./.cache/pip/http/f/e/d/0 0
136     ./.cache/pip/http/4/8/d/7/0 0
164     ./.cache/pip/http/a/0 0
16      ./.cache/pip/http/0/0/9/7/0 0
16      ./.cache/pip/http/2/8/0 0
... etc ...

我不知道是否有任何选项组合可以使du命令打印修改时间。如果有的话,请告诉我,我会指出它是哪个领域。

相关内容