1 簡介
xargs是一條Unix和類Unix作業系統的常用命令。它的作用是將參數列錶轉換成小塊分段傳遞給其他命令,以避免參數列表過長的問題。
2 特點
(1) 處理檔案/目錄名中的空格
find . -name '*~' -print0 | xargs -0 rm有一個問題,如果檔案或是目錄名含有空格,則可能會有些問題,這是因為xargs預設會按照空白自負來劃分輸入。一個簡單的解決辦法就是告訴find使用NUL(\0)來分割結果(通過向find提供-print0選項),並且告訴xargs也使用Nul來分隔輸入(-0)。
刪除備份檔案,即使含有空格:find . -name '*~' -print0 | xargs -0 rm
(2)當使用-i選項使,可以用{}代替每一個參數。
使用-i選項 ,預設使用{}代替前面傳送過來的參數。但是參數的長度有限制,所以可能需要使用-s選項,來擴大參數長度的大小
預設長度是4096
somecommand | xargs -s 50000 echo | xargs -I '{}' -s 100000 rm '{}'
使用-I選項,可以指定參數(不使用-i預設的{})
ls -l | xargs -I hahha echo hahha_123455666
total 2128_123455666
-rw-rw-r--. 1 algo algo 13420 Aug 20 14:15 all.cfg_123455666
(3)指定參數數量
如果你要執行的命令只接受1個或是2個參數,比如使用diff命令來對2個檔案進行比較,那麼xargs的-n選項就會非常有用,它可以指定一次向目標命令提供幾個參數,如果參數數量多於你制定的數量,則命令將會被重複調用,直到所有輸入都已經得到執行。注意,最後一次調用的參數有可能會少於指定的參數數量,下面讓我們來看一個簡單的例子:
echo {0..9} | xargs -n 2
0 1
2 3
4 5
6 7
8 9
(4)指定參數行數
同樣的,你也可以使用-L參數制定每次只對某幾行的輸入進行操作,比如-L 1將每次從輸入中取一行作為參數傳遞給待執行的命令,當然,你可以將1改為任意行,但1是最常用的,下面這條命令將示範如何得到每個git commit的代碼變化:
git log --format="%H %P" | xargs -L 1 git diff
(5)並行
並行休眠
$ time echo {1..5} | xargs -n 1 -P 5 sleep
real 0m5.013suser 0m0.003ssys 0m0.014s
線性休眠
$ time echo {1..5} | xargs -n 1 sleep
real 0m15.022suser 0m0.004ssys 0m0.015s
如果你對使用xargs進行並行計算感興趣,那麼你或許應該看看GNU parallel,相比較而言,xargs的優勢就是大多數系統預設都支援它,並且在BSD和OS X上也可以很容易的安裝,但是parallel則有許多非常贊的特性。
3使用舉例常見應用(1)find和xargs組合使用以對find返回的檔案清單執行某些操作。,find是個很強大的命令,它自己也有-exec和-delete這樣的參數可以用來執行命令和刪除檔案,儘管如此,如果你對find的這些選項不太瞭解,或是想不起來-exec那古怪的文法,那麼你還是可以使用更為簡單的xargs,並且xargs在效率上也更勝一籌。
本例中xargs將find產生的長串檔案清單拆散成多個子串,然後對每個子串調用rm。這樣要比如下使用find命令效率高的多。
find /path -type f -exec rm '{}' \;
參考自:http://heikezhi.com/yuanyi/things-you-didnt-know-about-xargs
“Things
you (probably) didn’t know about xargs”,作者:Cosmin
Stejerean