按大小对所有文本文件进行排序,生成路径文本列表

按大小对所有文本文件进行排序,生成路径文本列表

这给了我所有文本文件的路径列表:

find / -type f -name '*.txt' > ~/Desktop/sorted.txt

我想根据每个项目的文件大小对此路径列表进行排序,但我不确定该使用什么。这并没有像我预期的那样工作:

find / -type f -name '*.txt' |sort -S > ~/Desktop/sorted.txt

有什么建议么?

答案1

此命令wc对每个匹配文件使用单独的进程,因此其性能可能较差。我创建它时考虑了兼容性和 POSIX 兼容性。

find / -type f -name '*.txt' -exec wc -c {} \; | sort -t ' ' -n -k 1,1 | cut -d ' ' -f 2-

每个wc -c都会在表单中生成一行

12345 /path/to/file/possibly with spaces/foo.txt

其中第一个空格将字节数与路径分隔开。sort获取所有行,使用空格字符作为字段分隔符,并根据第一个字段(即根据字节数)按数字排序。然后cut使用空格字符作为字段分隔符,并从第二个字段(即除第一个字段之外的所有内容,即除字节数之外的所有内容,即路径)打印。

该解决方案可以轻松适应按行数排序:只需使用wc -l而不是wc -c


注意:
包含一个或多个换行符的路径会破坏我的代码。为了使代码不受此影响,可以使用支持空字符作为分隔符的工具。使用 POSIX 工具很难做到这一点,甚至根本无法做到。这个答案专注于可移植性,因此希望您文本文件的所有路径都是“好的”。

答案2

您始终可以采用将工具链接在一起的方法(可能不是最优的):

find / -type f -name '*.txt' -ls  | sort -nk7,7 | awk '{print $NF;}'
  • 查找开关-ls将显示许多额外的列,包括文件大小(在 GNU 工具集上,第 7 列在 MacOS 上可能有所不同)
  • 将对sort第 7 列(文件大小)进行数字排序
  • 删除awk所有其他字段并仅打印文件名

相关内容