2013-09-23 84 views
1

ls只是打印目录中的文件,并且wc -l统计特定文件名的行号,xargs会将ls输出一个一个地发送到wc -l,但最终的结果是总计,为什么?哪个命令在命令中添加总数ls | xargs wc -l?

输出样本:

14 doc.txt 
230 legion.c 
519 legion_agent.c 
    70 legion_manager.c 
    52 legion_privilege.c 
236 logic_agent.c 
349 protocol.c 
1470 total 

回答

4

wc组合了传递给是作为参数的所有文件的总线。 xargs收集来自输入的行,并将它们全部作为一组多个参数集合到wc中,以便获得所有这些文件的总数。

就好像我有文件ab一个例子,我跑:

wc -l a b 

我会得到

28 a 
17 b 
45 total 

同样,如果模仿的ls的输出与(echo a; echo b;)xargs我们”加入d得到相同的输出:

(echo a; echo b;) | xargs wc -l 

输出:

28 a 
17 b 
45 total 

如果再加上呼应:

(echo a; echo b;) | xargs echo wc -l 

输出:

wc -l a b 
+2

'xargs'也分割文件nam的列表e参数,如果它超过了'ARG_MAX',在这种情况下,您将获得多个'wc'调用并因此获得多个(子)'total'行。 – tripleee

+0

@tripleee感谢您的补充 – spin6lock

+1

感谢@ konsolebox,我误解了xargs的工作模式。我认为xargs在ls的每一行输出上触发'wc -l'。当只有一个参数供应时'wc -l'没有提供总线。 – spin6lock

0

试试这条线,看它是否给了你想要的东西:

grep -c '.*' *.*