将一个命令的输出通过管道传输到另一个命令时出现问题

将一个命令的输出通过管道传输到另一个命令时出现问题

我想直接对当前的所有文件进行递归排序。

我试过了ls -lh -R |sort >> output.txt。但我认为多线程问题造成了问题,在完成输出之前ls -lh -R,排序已经开始工作了。
现在我得到了错误的答案。我该如何正确执行。
我试图:回答这个问题

答案1

与多线程无关。ls完成其任务后,其所有输出都将发送到sort,之前从未发送过。

更高级的解释是:

Unix 管道将第一个进程的 STDOUT(标准输出)文件描述符连接到第二个进程的 STDIN(标准输入)。接下来会发生什么当第一个进程写入其 STDOUT 时,第二个进程可以立即读取该输出(从 STDIN)

使用多个管道与使用单个管道没什么区别。每个管道都是独立的,只是连接相邻进程的 STDOUT 和 STDIN。

[...] 管道本身在 Bash 脚本的任何地方都是一致的。

来源:如何简单解释一下 BASH 中管道的工作原理?

所以,我非常确定ls -lh -R |sort >> output.txt它运行良好。此外,我在/directoryand 中对我的系统进行了测试,它已正确处理了 1.597.396 个文件和目录(当然,我不得不等待一段时间)。


如果您希望按字母顺序排列文件名仅,不要使用ls-l参数。如果您不希望看到所有空白行,请使用带-u参数的 sort。因此,总的来说,您应该使用:

ls -h -R |sort -u >> output.txt

请参阅man lsman 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

相关内容