xargs 用法

如果你曾經花了許多時間在Unix命令行上,那麼或許你已經見過xargs了,如果你還沒聽過xargs,那就先讓我來解釋下,xargs是一個從標準輸入或許參數並執行命令的程序。

常見使用

我常常見到將find和xargs組合使用以對find返回的文件列表執行某些操作。

更新:根據Twitter和hacker news上的反饋,find是個很強大的命令,它自己也有-exec和-delete這樣的參數可以用來執行命令和刪除文件,儘管如此,如果你對find的這些選項不太瞭解,或是想不起來-exec那古怪的語法,那麼你還是可以使用更爲簡單的xargs,並且xargs在效率上也更勝一籌。

遞歸查找所有Python文件並統計文件行數

find . -name '*.py' | xargs wc -l

遞歸查找所有Emacs備份文件並刪除:

find . -name '*~' | xargs rm

遞歸查找所有Python文件並搜索import語句:

find . -name '*.py' | xargs grep 'import'

處理文件/目錄名中的空格

上面的例子有一個問題,如果文件或是目錄名含有空格,則可能會有些問題,這是因爲xargs默認會按照空白自負來劃分輸入。一個簡單的解決辦法就是告訴find使用NUL(\0)來分割結果(通過向find提供-print0選項),並且告訴xargs也使用Nul來分隔輸入(-0)。

刪除備份文件,即使含有空格:

find . -name '*~' -print0 | xargs -0 rm

參數位置

上面的例子中xargs從標準輸入讀取所有非空的元素並將他們連接起來提供給給定的命令進行執行,這在很多情況下會非常有用,儘管如此,有時你可能想要在命令中間插入一個參數,此時-J標記就排上用場了,xargs會爲-J參數後面的字符串加上輸入然後在執行。

將所有備份文件複製到backups目錄下:

find . -name '*~' -print 0 | xargs -0 -J % cp % ~/backups

最大命令長度

有時通過管道傳遞給xargs的輸入可能會造成要執行的命令超出最大命令行長度限制,你可以通過下面的命令得到命令行的最大長度:

getconf ARG_MAX

爲了避免越限,xargs對於結果命令有它自己的最大長度限制,如果提供的參數有可能會造成調用的命令超出長度限制,則xargs會將輸入分割成多個部分,並多次調用目標命令,默認的長度限制是4096,這可能要遠遠小於大多數現在系統的ARG_MAX設置,你可以通過向xargs提供-s標識來覆蓋這個默認設置,當你對一個很大的源代碼倉庫進行操作時,這會顯得尤其有用。

指定參數數量

如果你要執行的命令只接受1個或是2個參數,比如使用diff命令來對2個文件進行比較,那麼xargs的-n選項就會非常有用,它可以指定一次向目標命令提供幾個參數,如果參數數量多於你制定的數量,則命令將會被重複調用,直到所有輸入都已經得到執行。注意,最後一次調用的參數有可能會少於指定的參數數量,下面讓我們來看一個簡單的例子:

$ echo {0..9} | xargs -n 2

0 1
2 3
4 5
6 7
8 9

同樣的,你也可以使用-L參數制定每次只對某幾行的輸入進行操作,比如-L 1將每次從輸入中取一行作爲參數傳遞給待執行的命令,當然,你可以將1改爲任意行,但1是最常用的,下面這條命令將演示如何得到每個git commit的代碼變化:

git log --format="%H %P" | xargs -L 1 git diff

並行執行命令

你或許會使用xargs調用某些需要密集計算的命令,如果xargs可以利用你電腦上的多核計算能力,那該有多美妙?沒錯,-P參數就是幹這個的,通過這個參數xargs可以一次並行的調用多個命令,舉個例子,你可以通過它來並行的運行多個ffmpeg編碼器,不過,還是讓我們來個更簡單一點的例子吧:

並行休眠

$ time echo {1..5} | xargs -n 1 -P 5 sleep

real 0m5.013s
user 0m0.003s
sys 0m0.014s

線性休眠

$ time echo {1..5} | xargs -n 1 sleep

real 0m15.022s
user 0m0.004s
sys 0m0.015s

如果你對使用xargs進行並行計算感興趣,那麼你或許應該看看GNU parallel,相比較而言,xargs的優勢就是大多數系統默認都支持它,並且在BSD和OS X上也可以很容易的安裝,但是parallel則有許多非常讚的特性
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章