首頁  >  文章  >  運維  >  linux中xargs的用法詳解

linux中xargs的用法詳解

巴扎黑
巴扎黑原創
2017-08-22 13:57:522282瀏覽

xargs在linux中是個很有用的命令,它經常和其他命令組合起來使用,非常的靈活. 

xargs是給命令傳遞參數的一個過濾器,也是組合多個命令的一個工具.它把一個資料流分割為一些足夠小的區塊,以方便過濾器和命令進行處理.由此這個命令也是後置引用的一個強有力的替換.在一般使用過多參數的命令替換失敗的時候,用xargs來替換它一般都能成功.通常情況下,xargs從管道或stdin中讀取資料,但是它也能夠從檔案的輸出中讀取資料. 

xargs的預設指令是echo.這表示透過管道傳遞給xargs的輸入將會包含換行和空白,不過透過xargs的處理,換行和空白將被空格取代.如: 

bash$ ls -l 

total 0 

-rwxr-xr-x 2 .txt 

bash$ ls -l | xargs 

090218.txt 090607.txt 

bash$ find ~/mail -type f | xargs grep "Linux" 

bash$ find ~/mail -type f | xargs grep "Linux" 

#./misc:User-Agent: slrn/0.9.8.1 (Linux) 

./sent-mail-jul-2005: hosted by the Linux Documentation Project. 

. /sent-mail-jul-2005: (Linux Documentation Project Site, rtf version) 

./sent-mail-jul-2005: Subject: Criticism of Bozo's Windows/Linux article# 

#. . . 

ls | xargs -p -l gzip 使用gzips壓縮目前目錄下的每個檔案,一次壓縮一個, 並且在每次壓縮前都提示使用者. 

#注意: 一個有趣的xargs選項是-n NN,NN是限制每次傳遞進來參數的個數. 

ls | xargs -n 8 echo以每行8列的形式列出當前目錄下的所有檔案.

注意: 另一個有用的選項是-0,使用find -print0 或grep -lZ 這兩種組合方式. 這允許處理包含空白或引號的參數. 

find / - type f -print0 | xargs -0 grep -liwZ GUI | xargs -0 rm -f 

grep -rliwZ GUI / | xargs -0 rm -f 

上邊兩行都可以用來刪除任何包含"GUI"的檔案。

-i 表示find 傳遞給xargs的結果由{}來代替 

#-I 我認為是和i差不多,可以這麼認為-i可以用-I {} 來代替 

-p 互動式提問y來確認指令的每次執行。

-t 在執行前回顯各個command 

還有參數-s 和-x 具體查手冊.

下面是另一個範例,我們希望計算這些檔案中的行數:

 

$ file * | grep ASCII | cut -d":" -f1 | xargs wc -l

47853 alert_DBA102.log

19 dba102_cjq0_14493.trc

29053 dba102_mmnl_14497.trc

154 dba102_reco_14491.trc

#154 dba102_reco_14491.trc

#154 dba102_reco_14491.trc

43 dba102_ (註:上述任務還可用以下指令完成:) 

$ wc -l 'file * | grep ASCII | cut -d":" -f1 | grep ASCII | cut -d":" -f1'

該xargs 版本用於闡釋概念。 Linux 可以用幾種方法來完成同一個任務;請使用最適合您的情況的方法。

 

使用此方法,您可以快速重新命名目錄中的檔案。

 

$ ls | xargs -t -i mv {} {}.bak

-i 選項告訴 xargs 用每個項目的名稱取代 {}。 -t 選項指示 xargs 先列印指令,然後再執行。

 

另一個非常有用的操作是當您使用vi 開啟要編輯的檔案:

 

$ file * | grep ASCII | cut -d":" -f1 | xargs vi

該指令使用vi 逐一開啟檔案。當您希望搜尋多個文件並打開它們進行編輯時,使用該命令非常方便。

 

它還有幾個選項。最有用的可能是-p 選項,它使操作具有可交互性:

 

# file * | grep ASCII | cut -d":" -f1 | xargs -p vi

vi alert_DBA102.log dba102_cjq0_14493.trc dba102_mmnl_14497.trc

#dba102_reco_14491.trc dba102_rvwr##dba102_reco_14491.trc dba102_rvwr##dba102_reco_14491.trc dba102_rvwrwr_14518.trcx確認。如果您按下 "y",則執行命令。當您對檔案進行某些可能有破壞且不可恢復的操作(如刪除或覆蓋)時,您會發現該選項非常有用。

 

-t 選項使用一個詳細模式;它顯示要執行的指令,是偵錯過程中一個非常有幫助的選項。 

如果傳給 xargs 的輸出為空怎麼辦?考慮以下指令:

 

$ file * | grep SSSSSS | cut -d":" -f1 | xargs -t wc -l wc -l 0 $

在此處,搜尋"SSSSSS" 後沒有匹配的內容;因此xargs 的輸入均為空,如第二行所示(由於我們使用-t 這個詳細選項而產生的結果)。雖然這可能會有所幫助,但在某些情況下,如果沒有要處理的內容,您可能希望停止xargs;如果是這樣,可以使用-r 選項:

$ file * | grep SSSSSS | cut -d":" -f1 | xargs -t -r wc -l $

如果沒有要運行的內容,該命令退出。

 

假設您希望使用 rm 命令(該命令將作為 xargs 命令的參數)刪除檔案。然而,rm 只能接受有限數量的參數。如果您的參數清單超出該限制怎麼辦? xargs 的 -n 選項限制單一命令列的參數個數。 

下面顯示如何限制每個命令列只使用兩個參數:即使向 xargs ls -ltr 傳遞五個文件,但每次向 ls -ltr 僅傳遞兩個文件。

 

$ file * | grep ASCII | cut -d":" -f1 | xargs -t -n2 ls -ltr

ls -ltr alert_DBA102.log dba102_cjq0_14493. trc

-rw-r----- 1 oracle dba 738 Aug 10 19:18 dba102_cjq0_14493.trc

-rw-r--r-- 1 oracle dba 24102

-rw-r--r-- 1 oracle dba 2410225 Aug 13 05 :31 alert_DBA102.log

 

ls -ltr dba102_mmnl_14497.trc dba102_reco_14491.trc

-rw-r----- 1 oracle dba 5386163 Aug 10163 Aug 10175:50 dba102_mmnl_14497.trc

-rw-r----- 1 oracle dba 6808 Aug 13 05:21 dba102_reco_14491.trc

 

##ls#ls#wr110518.

#-rw-r----- 1 oracle dba 2087 Aug 10 04:30 dba102_rvwr_14518.trc

#使用此方法,您可以快速重新命名目錄中的檔案。

以上是linux中xargs的用法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn