Linux中國

如何在Linux里使用xargs命令

xargs命令有兩個要點。第一,你必須列出目標文件。第二,你必須指定對每個文件需要執行的命令或腳本。

這篇教程會涉及三個應用場景,xargs命令被用來處理分布在不同目錄下的文件:

  1. 計算所有文件的行數
  2. 列印指定文件的第一行
  3. 對每個文件執行一個自定義腳本

請看下面這個叫xargstest的目錄(用tree命令以及-i和-f選項顯示了目錄樹結構,這樣可以避免縮進顯示而且每個文件都會帶有完整路徑):

$ tree -if xargstest/ 

這六個文件的內容分別如下:

這個xargstest目錄,以及它包含的子目錄和文件將用在下面的例子中。

場景1:計算所有文件的行數

就像之前提到的,使用xargs命令的第一個要點是一個用來運行命令或腳本的文件列表。我們可以用find命令來確定和列出目標文件。選項-name 'file??'指定了xargstest目錄下那些名字以"file"開頭並跟隨兩個任意字元的文件才是匹配的。這個搜索默認是遞歸的,意思是find命令會在xargstest和它的子目錄下搜索匹配的文件。

$ find xargstest/ -name 'file??' 
xargstest/dir3/file3B
xargstest/dir3/file3A
xargstest/dir1/file1A
xargstest/dir1/file1B
xargstest/dir2/file2B
xargstest/dir2/file2A

我們可以通過管道把結果發給sort命令讓文件名按順序排列:

$ find xargstest/ -name 'file??' | sort 
xargstest/dir1/file1A
xargstest/dir1/file1B
xargstest/dir2/file2A
xargstest/dir2/file2B
xargstest/dir3/file3A
xargstest/dir3/file3B

然後我們需要第二個要素,就是需要執行的命令。我們使用帶有-l選項的wc命令來計算每個文件包含的換行符數目(會在輸出的每一行的前面列印出來):

$ find xargstest/ -name 'file??' | sort | xargs wc -l 
 1 xargstest/dir1/file1A
 2 xargstest/dir1/file1B
 3 xargstest/dir2/file2A
 4 xargstest/dir2/file2B
 5 xargstest/dir3/file3A
 6 xargstest/dir3/file3B
21 total

可以看到,不用對每個文件手動執行一次wc -l命令,而xargs命令可以讓你在一步里完成所有操作。那些之前看起來無法完成的任務,例如單獨處理數百個文件,現在可以相當輕鬆地完成了。

場景2:列印指定文件的第一行

既然你已經有一些使用xargs命令的基礎,你可以自由選擇執行什麼命令。有時,你也許希望只對一部分文件執行操作而忽略其他的。在這種情況下,你可以使用find命令的-name選項以及?通配符(匹配任意單個字元)來選中特定文件並通過管道輸出給xargs命令。舉個例子,如果你想列印以「B」字元結尾的文件而忽略以「A」結尾的文件的第一行,可以使用下面的find、xargs和head命令組合來完成(head -n1會列印一個文件的第一行):

$ find xargstest/ -name 'file?B' | sort | xargs head -n1 
==> xargstest/dir1/file1B <==
one

==> xargstest/dir2/file2B <==
one

==> xargstest/dir3/file3B <==
one

你將看到只有以「B」結尾的文件會被處理,而所有以「A」結尾的文件都被忽略了。

場景3:對每個文件執行一個自定義腳本

最後,你也許希望對一些文件執行一個自定義腳本(例如Bash、Python或是Perl)。要做到這一點,只要簡單地用你的自定義腳本名字替換掉之前例子中的wc和head命令就好了:

$ find xargstest/ -name &apos;file??&apos; | xargs myscript.sh 

自定義腳本myscript.sh需要寫成接受一個文件名作為參數並處理這個文件。上面的命令將為find命令找到的每個文件分別調用腳本。

注意一下上面的例子中的文件名並沒有包含空格。通常來說,在Linux環境下操作沒有空格的文件名會舒服很多。如果你實在是需要處理名字中帶有空格的文件,上邊的命令就不能用了,需要稍微處理一下來讓它可以被接受。這可以通過find命令的-print0選項(它會列印完整的文件名到標準輸出,並以空字元結尾),以及xargs命令的-0選項(它會以空字元作為字元串結束標記)來實現,就像下面的例子:

$ find xargstest/ -name &apos;file*&apos; -print0 | xargs -0 myscript.sh 

注意一下,-name選項所跟的參數已經改為'file*',意思是所有以"file"開頭而結尾可以是任意字元的文件都會被選中。

總結

在看完這篇教程後你應該會理解xargs命令的作用,以及如何應用到自己的工作中。很快你就可以有時間享受這個命令所帶來的高效率,而不用把你的時間耗費在一些重複的任務上了。想了解更詳細的信息以及更多的選項,你可以在終端中輸入'man xargs'命令來查看xargs的文檔。

via: http://xmodulo.com/xargs-command-linux.html

作者:Joshua Reed 譯者:zpl1025 校對:Caroline

本文由 LCTT 原創翻譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國