啥時(shí)候用xargs
主要講述以下兩個(gè)shell指令區(qū)別,通過這個(gè)例子來理解xargs與管道
1 不加xargs的管道
管道都是前面的輸出作為后面的輸入,而不加xargs這種正常的管道,講的具體一點(diǎn)是:
前面的輸出變成一個(gè)匿名文件,后面的shell接這個(gè)匿名文件
我們?cè)敿?xì)展開第一句的效果等同于下面的shell,這樣作用就很明顯了,就是先找到當(dāng)前目錄下test開頭的文件列表,然后呢這些文件名里面含有js字樣的給過濾出來
因?yàn)槲耶?dāng)前目錄有多個(gè)testx.js文件,所以上述指令結(jié)果如下
2?加xargs的管道
同樣還是前面的輸出作為后面的輸入,只不過這次沒有中間文件了,
前面shell的字符串輸出,通過空格和回車拆分成1或多條,后面shell接這一或多條
我們將第二局shell展開,就等效于下面指令,即找到所有test開頭的文件,并在文件內(nèi)容里尋找js字樣,注意不加xargs是在文件名里尋找??梢酝ㄟ^xargs后面加-t查看實(shí)際執(zhí)行的shell。
這幾個(gè)js文件的內(nèi)容中基本也都含有js字樣,指令結(jié)果如下。

3 xargs補(bǔ)充
3.1 -0 與 -d (這是零,不是O)
默認(rèn)是空格或回車為分割,但是文本中可能原來就有空格,經(jīng)常會(huì)有不想用空格做分割的情況,或者文本中本來有回車符,但是只想用多行shell輸出的回車符號(hào)。那么可以在前一個(gè)shell最后添加 -print0 表示用 \0 這個(gè)字符來分割shell輸出的每一行,后一個(gè)shell用xargs -0即可避免文本中本來的空格或回車引起的多分了行。
也可以使用-d自己指定分隔符,例如只指定回符號(hào)如下
3.2 -L 與 -I (大L與大i)
前面我們發(fā)現(xiàn)雖然有多行,但是第二句shell還是把多行隔開后,拼成了一句grep語句了,如果想每一行分別作為一句shell去運(yùn)行,則可以用-L 1參數(shù),1就是前面結(jié)果列表中一個(gè)元素過來拼成一個(gè)新的shell。
此時(shí)等價(jià)于
此外有時(shí)候我們的管道過來的字符串并不一定是放到shell最后,可能是前面,那強(qiáng)大的-I就提供了這個(gè)功能,下面占位符可以換成任意字符,常用{}罷了,也可以換成xxx等。
-I作用后,shell就只能被拆分了,所以也有-L 1的效果,等效于如下