我不太了解 Linux 命令行中的管道。
我注意到:
ll - R | grep *.pdf
将列出以以下结尾的文件 .pdf
但
locate *.pdf | du -h
不会计算以 . 结尾的文件的大小.pdf
。相反,它会列出当前目录中文件的大小。
这里出了什么问题?
我的想法是第一个命令的输出是下一个命令的输入。
答案1
管道的工作原理是将一个程序的输出发送到另一个程序的输入。这意味着接收另一个程序输出的程序必须能够读取STDIN
(标准流)。
在这种情况下,grep
能够读取的输出ll
因为它就是这样设计的。du
期望一个命令行参数指向它应该运行的目录(如果没有给出目录,它将默认为当前工作目录./
)。
至于查看.pdf
文件的大小,如果所有文件都在一个目录中,您可以运行du -h -d1 /path/to/pdf/dir
或locate *.pdf | xargs | du -h
。如果它们位于不同的目录中,您将需要一起使用-exec
and find
(另一个用户可能会帮助您,我不太确定如何做到这一点)。
答案2
我的想法是第一个命令的输出是下一个命令的输入。
那是对的。但是,在您的两个示例中,区别在于grep
作用于其输入,而不du
作用于其输入。仅当第一个命令向标准输出第二个从标准输入,在这种情况下,这两个流将通过“管道”连接。您可以通过在命令的手册页中查找“标准输入”和“标准输出”来确定这是否可行。