2015-10-06 165 views
2

一個簡短的問題。 的命令Linux xargs命令

cat * | wc -c 

不需要xargs的,但命令

ls | xargs echo 

需要xargs的命令。 可以請某人更清楚地向我解釋xargs的概念。 謝謝。

回答

5

總之,xargsstdin(標準輸入)轉換爲您指定的命令的參數。例如

$ seq 1 3 
1 
2 
3 
$ seq 1 3 | xargs echo 
1 2 3 

seq,你可以看到,打印序列stdout。我們pipe(|)輸出到xargsstdinxargs調用echostdin作爲參數,所以我們得到echo 1 2 3

el.pescado saidwc接受stdin的輸入(您也可以給它一個文件參數)。由於cat將文件打印到stdout,因此可以將其直接傳送到wc

$ cat text 
This is only 
a test 
$ cat text | wc 
     2  5  20 
$ wc text 
2 5 20 text 

echo不接受任何stdin。這很奇怪,因爲echo的工作是打印到stdout - 你可以打印任何你想要的東西。因此,您使用xargs將流轉換爲參數。

echo可能太微不足道了,看看發生了什麼,所以這裏有一個更真實的例子。說我們已經有了一些文件的目錄中它:

$ ls 
bar1 foo1 foo2 foo3 foo4 foo5 foo6 

我們已經受夠了這裏foo,我們要刪除所有的人,但我們不能被人打擾鍵入rm foo1 foo2 ... 。畢竟,我們是程序員,而且我們很懶。我們所能做的是...

$ ls foo* | xargs rm 
$ ls 
bar1 

rm預計參數,ls foo*我們要刪除所有文件打印,並xargs做翻譯。


作爲一個側面說明,有時你想stdin分割成小塊。 xargs -n對此非常有用,並且一次將N個參數傳遞給最終命令。

$ ls foo* | xargs -n2 echo 
foo1 foo2 
foo3 foo4 
foo5 foo6 
+1

謝謝,這是一個非常好的解釋。 真的很感激。 –

1

wc從其標準輸入讀取數據,而echo打印其命令行參數