通过管道传递值

通过管道传递值

我不太了解 Linux 命令行中的管道。

我注意到:

ll - R | grep *.pdf

将列出以以下结尾的文件 .pdf

locate *.pdf | du -h

不会计算以 . 结尾的文件的大小.pdf。相反,它会列出当前目录中文件的大小。

这里出了什么问题?

我的想法是第一个命令的输出是下一个命令的输入。

答案1

管道的工作原理是将一个程序的输出发送到另一个程序的输入。这意味着接收另一个程序输出的程序必须能够读取STDIN(标准流)。

在这种情况下,grep能够读取的输出ll因为它就是这样设计的。du期望一个命令行参数指向它应该运行的目录(如果没有给出目录,它将默认为当前工作目录./)。

至于查看.pdf文件的大小,如果所有文件都在一个目录中,您可以运行du -h -d1 /path/to/pdf/dirlocate *.pdf | xargs | du -h。如果它们位于不同的目录中,您将需要一起使用-execand find(另一个用户可能会帮助您,我不太确定如何做到这一点)。

答案2

我的想法是第一个命令的输出是下一个命令的输入。

那是对的。但是,在您的两个示例中,区别在于grep作用于其输入,而不du作用于其输入。仅当第一个命令向标准输出第二个从标准输入,在这种情况下,这两个流将通过“管道”连接。您可以通过在命令的手册页中查找“标准输入”和“标准输出”来确定这是否可行。

相关内容