記錄一linux命令 xargs

2021-06-18 05:34:59 字數 3589 閱讀 1796

**:

xargs

大多數 linux 命令都會產生輸出:檔案列表、字串列表等。但如果要使用其他某個命令並將前乙個命令的輸出作為引數該怎麼辦?例如,file 命令顯示檔案型別(可執行檔案、ascii 文字等);您可以處理輸出,使其僅顯示檔名,現在您希望將這些名稱傳遞給 ls -l 命令以檢視時間戳記。xargs 命令就是用來完成此項工作的。它允許您對輸出執行其他某些命令。記住下面這個來自於第 1 部分中的語法: 

file -lz * | grep ascii | cut -d":" -f1 | xargs ls -ltr

讓我們來剖析這個命令字串。第乙個,file -lz *,用於查詢是符號鏈結或者經過壓縮的檔案。它將輸出傳遞給下乙個命令 grep ascii,該命令在其中搜尋 "ascii" 字串並產生如下所示的輸出: alert_dba102.log:        ascii english text

alert_dba102.log.z:      ascii text (compress』d data 16 bits)

dba102_asmb_12307.trc.z: ascii english text (compress』d data 16 bits)

dba102_asmb_20653.trc.z: ascii english text (compress』d data 16 bits)

由於我們只對檔名感興趣,因此我們應用下乙個命令 cut -d":" -f1,僅顯示第乙個字段: alert_dba102.log

alert_dba102.log.z

dba102_asmb_12307.trc.z

dba102_asmb_20653.trc.z

現在,我們希望使用 ls -l 命令,將上述列表作為引數進行傳遞,一次傳遞乙個。xargs 命令允許您這樣做。最後一部分,xargs ls -ltr,用於接收輸出並對其執行 ls -ltr 命令,如下所示:

ls -ltr alert_dba102.log

ls -ltr alert_dba102.log.z

ls -ltr dba102_asmb_12307.trc.z

ls -ltr dba102_asmb_20653.trc.z

因此,xargs 本身雖然沒有多大用處,但在與其他命令相結合時,它的功能非常強大。

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

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

47853 alert_dba102.log

1array dba102_cjq0_144array3.trc

2array053 dba102_mmnl_144array7.trc

154 dba102_reco_144array1.trc

43 dba102_rvwr_14518.trc

77122 total

(注:上述任務還可用以下命令完成:)

$ 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_144array3.trc dba102_mmnl_144array7.trc 

dba102_reco_144array1.trc dba102_rvwr_14518.trc ?...

此處的 xarg 要求您在執行每個命令之前進行確認。如果您按下 "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_144array3.trc 

-rw-r-----    1 oracle   dba           738 aug 10 1array:18 dba102_cjq0_144array3.trc

-rw-r--r--    1 oracle   dba       2410225 aug 13 05:31 alert_dba102.log

ls -ltr dba102_mmnl_144array7.trc dba102_reco_144array1.trc 

-rw-r-----    1 oracle   dba       5386163 aug 10 17:55 dba102_mmnl_144array7.trc

-rw-r-----    1 oracle   dba          6808 aug 13 05:21 dba102_reco_144array1.trc

ls -ltr dba102_rvwr_14518.trc 

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

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

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

-i 選項告訴 xargs 用每項的名稱替換 {}。 

如果你覺得本文不錯,可以訂閱本站rss | 

記錄一linux命令 xargs

記錄一linux命令 xargs 收藏 原貼 xargs 大多數 linux 命令都會產生輸出 檔案列表 字串列表等。但如果要使用其他某個命令並將前乙個命令的輸出作為引數該怎麼辦?例如,file 命令顯示檔案型別 可執行檔案 ascii 文字等 你能處理輸出,使其僅顯示檔名,目前你希望將這些名稱傳遞...

Linux基礎 xargs命令

xargs可以將輸入內容 通常通過命令列管道傳遞 轉成後續命令的引數,通常用途有 命令組合 尤其是一些命令不支援管道輸入,比如ls。避免引數過長 xargs可以通過 nx來將引數分組,避免引數過長。使用語法如下 usage xargs option command initial args.run ...

linux過濾命令 xargs

xargs命令是給其他命令傳遞引數的乙個過濾器,也是組合多個命令的乙個工具。它擅長將標準輸入資料轉換成命令列引數,xargs能夠處理管道或者stdin並將其轉換成特定命令的命令引數。xargs也可以將單行或多行文字輸入轉換為其他格式,例如多行變單行,單行變多行。xargs的預設命令是echo,空格是...