2,343 瀏覽數

Linux command – xargs

xargs – build and execute command lines from standard input

從標準輸入構建和執行命令行?看不懂,先直接來看一個範例.

root@ubuntu:~/test# find ./ -type f -exec grep Ben {} \;
Ben ben bEn
root@ubuntu:~/test# find ./ -type f -exec grep -l Ben {} \;
./test.txt

find 參數
-type f
找出屬性為檔案 f (file) ,還可針對目錄 d (directory) -type d ,連結 l (softlink) -type l來尋找.
-exec
將之前的結果轉向 grep -l Ben 來處理 , {} 表示之前的結果 , \; 結束.

上面的指令可以使用 xargs 取代

root@ubuntu:~/test# find ./ -type f | xargs grep Ben
./test.txt:Ben ben bEn

xargs 指令會標準輸入(standard input)讀取資料,並以空白字元做分隔.

root@ubuntu:~/test# find ./ -type f
./test.txt
./test2.txt
./test1.txt

使用 xargs 之後,所有搜尋出來的資料會變成一整串字串 (使用空白鍵做分隔).

root@ubuntu:~/test# find ./ -type f | xargs 
./test.txt ./test2.txt ./test1.txt

-p, –interactive
xargs使用方式是將指令放在參數之後

root@ubuntu:~/test# find ./ -type f | xargs -p grep Ben
grep Ben ./test.txt ./test2.txt ./test1.txt ?...y
./test.txt:Ben ben bEn

參數 -p, –interactive
使用者可以先確認指令 並使用 ‘Y’或`Y’ 決定是否運行該指令.

-n, max-args
使用者還可以自行決定指令所使用的參數個數.

root@ubuntu:~/test# find ./ -type f | xargs -p -n 1 grep Ben
grep Ben ./test.txt ?...y
Ben ben bEn
grep Ben ./test2.txt ?...y
grep Ben ./test1.txt ?...y

參數 -n, max-args
設定一次可運行指令所使用的參數個數上限值,預設值為1.

-r, –no-run-if-empty
下面的例子是 find 找不到任何東西,但 xargs 還是會去執行後面的指令,使用參數 -r 可以避免.

root@ubuntu:~/test# find ./ -name *.dff | xargs -p grep Ben
grep Ben ?...y
root@ubuntu:~/test# find ./ -name *.dff | xargs -p -r grep Ben

參數 -r, –no-run-if-empty
不運行命令如果標準輸入為空白.

-t, –verbose
參數 -t 可以讓使用者得知 xargs 是執行了什麼指令.

root@ubuntu:~/test# find ./ -type f | xargs -t grep Ben
grep Ben ./test.txt ./test2.txt ./test1.txt 
./test.txt:Ben ben bEn

參數 -t, –verbose
在執行結果前輸出 xargs 執行的指令為何.

One Reply to “Linux command – xargs”

  1. 自動參照通知: RHEL5 – iSCSI | Benjr.tw

發表迴響