我想直接对当前的所有文件进行递归排序。
我试过了ls -lh -R |sort >> output.txt
。但我认为多线程问题造成了问题,在完成输出之前ls -lh -R
,排序已经开始工作了。
现在我得到了错误的答案。我该如何正确执行。
我试图:回答这个问题
答案1
与多线程无关。ls
完成其任务后,其所有输出都将发送到sort
,之前从未发送过。
更高级的解释是:
Unix 管道将第一个进程的 STDOUT(标准输出)文件描述符连接到第二个进程的 STDIN(标准输入)。接下来会发生什么当第一个进程写入其 STDOUT 时,第二个进程可以立即读取该输出(从 STDIN)。
使用多个管道与使用单个管道没什么区别。每个管道都是独立的,只是连接相邻进程的 STDOUT 和 STDIN。
[...] 管道本身在 Bash 脚本的任何地方都是一致的。
所以,我非常确定ls -lh -R |sort >> output.txt
它运行良好。此外,我在/
directoryand 中对我的系统进行了测试,它已正确处理了 1.597.396 个文件和目录(当然,我不得不等待一段时间)。
如果您希望按字母顺序排列文件名仅,不要使用ls
带-l
参数。如果您不希望看到所有空白行,请使用带-u
参数的 sort。因此,总的来说,您应该使用:
ls -h -R |sort -u >> output.txt
请参阅man ls
和man sort
以获得更多选项或以获得更好的理解。
答案2
尝试使用find
而不是ls -R
,例如查找当前目录及其子目录中所有大于 100MB 的文件,然后按(人类可读的)大小对它们进行排序,并列出最大的 10 个
find . -size +100M -exec du -hd 1 {} \; | sort -hr | head -10
或者(稍微更强大一点)
while read -rd $'\0' file; do du -h "$file"; done < <(find . -size +100M -print0) | sort -hr | head -10