2012-02-15 17 views
5

我正在尝试为当前目录中的每个目录使用du命令。所以我试图使用这样的代码:为什么du或echo流水线不工作?

ls | du -sb 

但它没有按预期工作。它仅输出当前的大小'。'。目录和那是所有。 同样的事情与回声

ls | echo 

输出空行。这是为什么发生?

回答

11

使用管发送第一命令的输出(标准输出),子进程(第二命令)的标准输入(输入)。你提到的命令在stdin上没有任何输入。这会工作,例如,与cat(和工作,我的意思是工作就像cat运行不带任何参数,只是沿着输入你给它传递):

ls | cat 

对于您的应用程序,这就是xargs它采用管道输入并将其作为所指定命令的参数。所以,你可以把它一样工作:

ls | xargs du -sb 

要注意的是默认xargs将打破空间的输入,因此,如果您的文件名包含空格,只要你想这是不行的。因此,在这种特殊情况下,这将是更好的:

du -sb * 
+0

什么都-sb *意思? – Romeno 2012-02-15 17:55:24

+0

'*'是一个glob(或者你可能知道的通配符)。 shell将用当前目录中与其匹配的所有文件(或目录等)名称替换它。例如,Y也可以用'* .jpg'来匹配任何以.jpg结尾的文件 – FatalError 2012-02-15 18:02:19

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

$ ls -d */ | xargs du -sb 
3

使用命令替换,就像这样:

du -sb $(ls -d */)