为什么du或echo管道不起作用?

7

我想针对当前目录中的每个目录使用du命令。因此,我尝试使用以下代码:

ls | du -sb

但它并没有按预期工作。它只输出当前“.”目录的大小,仅此而已。echo也是如此。

ls | echo

输出空行。为什么会这样?

3个回答

17

使用管道将第一个命令的输出(stdout)发送到子进程(第二个命令)的stdin(输入)。你提到的命令不会在stdin上接受任何输入。例如,这将适用于cat (并且通过“工作”,我是指像使用没有参数运行的cat一样,只需传递你提供的输入):

ls | cat

对于您的应用程序而言,这就是 xargs 起作用的地方。它接受管道输入并将其作为参数提供给指定的命令。因此,您可以像这样让它工作:

ls | xargs du -sb

需要注意的是,默认情况下xargs将使用空格来分隔输入内容,所以如果你的文件名中包含空格,它就无法按照你的预期工作。因此,在这种特殊情况下,最好这样操作:

du -sb *

1
”是通配符(或者你可能知道的通配符)。Shell会用当前目录中与之匹配的所有文件(或目录等)名称替换它。例如,您也可以使用“.jpg”来匹配以.jpg结尾的任何文件。 - FatalError

5

使用命令替换,像这样:

du -sb $(ls -d */)

2
$ find . -type d -maxdepth 1 -exec du -sb {} \;

或者

$ ls -d */ | xargs du -sb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接