linux下xargs命令用法詳解

2021-06-18 10:22:57 字數 3601 閱讀 8917

原文

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

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

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

bash$ ls -l

total 0

-rwxr-xr-x 2 root root 4096 2009-02-23 090218.txt

-rwxr-xr-x 2 root root 12288 2009-06-08 090607.txt

bash$ ls -l | xargs

090218.txt 090607.txt

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

29053dba102_mmnl_14497.trc

154 dba102_reco_14491.trc

43 dba102_rvwr_14518.trc

77122total

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

$ 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 先列印命令,然後再執行。

$ 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.trcdba102_mmnl_14497.trc

dba102_reco_14491.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_14493.trc

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

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

ls -ltr dba102_mmnl_14497.trcdba102_reco_14491.trc

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

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

ls -ltrdba102_rvwr_14518.trc

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

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

linux下xargs命令用法詳解

日期 2010 01 13 來自 網際網路 瀏覽 11945 linux下xargs命令用法詳解 xargs在linux中是個很有用的命令,它經常和其他命令組合起來使用,非常的靈活.xargs是給命令傳遞引數的乙個過濾器,也是組合多個命令的乙個工具.它把乙個資料流分割為一些足夠小的塊,以方便過濾器和...

linux下xargs命令用法詳解

xargs在linux中是個很有用的命令,它經常和其他命令組合起來使用,非常的靈活.xargs是給命令傳遞引數的乙個過濾器,也是組合多個命令的乙個工具.它把乙個資料流分割為一些足夠小的塊,以方便過濾器和命令進行處理.由此這個命令也是後置引用的乙個強有力的替換.在一般使用過多引數的命令替換失敗的時候,...

Linux下xargs命令詳解

linux下xargs命令詳解 xargs是給命令傳遞引數的乙個過濾器,也是組合多個命令的乙個工具。它把乙個資料流分割為一些足夠小的塊,以方便過濾器和命令進行處理。通常情況下,xargs從管道或者stdin中讀取資料,但是它也能夠從檔案的輸出中讀取資料。xargs的預設命令是echo,這意味著通過管...