關於xargs,你可能不知道的

2021-09-06 04:13:04 字數 2364 閱讀 9415

by yuanyi

| published: 

2011/07/18

如果你曾經花了許多時間在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 | xargs -n 2

0 12 3

4 56 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 | xargs -n 1 -p 5 sleep

real 0m5.013s

user 0m0.003s

sys 0m0.014s

線性休眠

$ time echo | xargs -n 1 sleep

real 0m15.022s

user 0m0.004s

sys 0m0.015s

如果你對使用xargs進行平行計算感興趣,那麼你或許應該看看gnu parallel,相比較而言,xargs的優勢就是大多數系統預設都支援它,並且在bsd和os x上也可以很容易的安裝,但是parallel則有許多非常贊的特性。

如果你發現這篇帖子有用,別忘了在twitter follow下我哦。

你可能不知道的東西

元素可以分為塊級元素,行內元素以及行內塊級元素。行內元素的margin或者padding只有margin left和margin right以及padding left和padding right有效果,margin top margin bottom padding top padding bot...

你可能不知道的const

眾所周知,使用 const 宣告的變數必須同時初始化為某個值。一經宣告,在其生命週期的任何時候都不能再重新賦予新值 const a syntaxerror 常量宣告時沒有初始化 const b 3 console.log b 3 b 4 typeerror 給常量賦值const 宣告只應用到頂級原語...

你可能不知道的python logging機制

先來看幾個例子,先想一下執行結果,答案稍後揭曉 例一 mylogger logging.getlogger mylogger mylogger.info mylogger info mylogger.warning mylogger warning 例二 mylogger logging.getlo...