这给了我所有文本文件的路径列表:
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
所有其他字段并仅打印文件名