linux --- 命令 --- xargs用法

來源:互聯網
上載者:User

linux --- 命令 --- 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 20 12 34 56 78 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 sleepreal 0m5.013suser 0m0.003ssys 0m0.014s線性休眠$ time echo {1..5} | xargs -n 1 sleepreal 0m15.022suser 0m0.004ssys 0m0.015s如果你對使用xargs進行並行計算感興趣,那麼你或許應該看看GNU parallel,相比較而言,xargs的優勢就是大多數系統預設都支援它,並且在BSD和OS X上也可以很容易的安裝,但是parallel則有許多非常贊的特性。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.