xargs 是在做什么的呢?就以字面上的意義來看,x 是加減乘除的乘號,args 則是 arguments (參數) 的意思,所以說,這個玩意兒就是在產生某個命令的參數的意思! xargs 可以讀入 stdin 的數據,並且以空格符或斷行字符作為分辨,將 stdin 的數據分隔成為 arguments 。 因為是以空格符作為分隔,所以,如果有一些檔名或者是其他意義的名詞內含有空格符的時候, xargs 可能就會誤判了~他的用法其實也還蠻簡單的!就來看一看先!
[root@www ~]# xargs [-0epn] command 選項與參數: -0 :如果輸入的 stdin 含有特殊字符,例如 `, \, 空格鍵等等字符時,這個 -0 參數 可以將他還原成一般字符。這個參數可以用於特殊狀態喔! -e :這個是 EOF (end of file) 的意思。后面可以接一個字符串,當 xargs 分析到 這個字符串時,就會停止繼續工作! -p :在運行每個命令的 argument 時,都會詢問使用者的意思; -n :后面接次數,每次 command 命令運行時,要使用幾個參數的意思。看范例三。 當 xargs 后面沒有接任何的命令時,默認是以 echo 來進行輸出喔! 范例一:將 /etc/passwd 內的第一欄取出,僅取三行,使用 finger 這個命令將每個 賬號內容秀出來 [root@www ~]# cut -d':' -f1 /etc/passwd |head -n 3| xargs finger Login: root Name: root Directory: /root Shell: /bin/bash Never logged in. No mail. No Plan. ......底下省略..... # 由 finger account 可以取得該賬號的相關說明內容,例如上面的輸出就是 finger root # 后的結果。在這個例子當中,我們利用 cut 取出賬號名稱,用 head 取出三個賬號, # 最后則是由 xargs 將三個賬號的名稱變成 finger 后面需要的參數! 范例二:同上,但是每次運行 finger 時,都要詢問使用者是否動作? [root@www ~]# cut -d':' -f1 /etc/passwd |head -n 3| xargs -p finger finger root bin daemon ?...y .....(底下省略).... # 呵呵!這個 -p 的選項可以讓用戶的使用過程中,被詢問到每個命令是否運行! 范例三:將所有的 /etc/passwd 內的賬號都以 finger 查閱,但一次僅查閱五個賬號 [root@www ~]# cut -d':' -f1 /etc/passwd | xargs -p -n 5 finger finger root bin daemon adm lp ?...y .....(中間省略).... finger uucp operator games gopher ftp ?...y .....(底下省略).... # 在這里鳥哥使用了 -p 這個參數來讓您對於 -n 更有概念。一般來說,某些命令后面 # 可以接的 arguments 是有限制的,不能無限制的累加,此時,我們可以利用 -n # 來幫助我們將參數分成數個部分,每個部分分別再以命令來運行!這樣就 OK 啦!^_^ 范例四:同上,但是當分析到 lp 就結束這串命令? [root@www ~]# cut -d':' -f1 /etc/passwd | xargs -p -e'lp' finger finger root bin daemon adm ?... # 仔細與上面的案例做比較。也同時注意,那個 -e'lp' 是連在一起的,中間沒有空格鍵。 # 上個例子當中,第五個參數是 lp 啊,那么我們下達 -e'lp' 后,則分析到 lp # 這個字符串時,后面的其他 stdin 的內容就會被 xargs 舍棄掉了!
其實,在 man xargs 里面就有三四個小范例,您可以自行參考一下內容。 此外, xargs 真的是很好用的一個玩意兒!您真的需要好好的參詳參詳!會使用 xargs 的原因是, 很多命令其實並不支持管線命令,因此我們可以透過 xargs 來提供該命令引用 standard input 之用!舉例來說,我們使用如下的范例來說明:
范例五:找出 /sbin 底下具有特殊權限的檔名,並使用 ls -l 列出詳細屬性 [root@www ~]# find /sbin -perm +7000 | ls -l # 結果竟然僅有列出 root 所在目錄下的文件!這不是我們要的! # 因為 ll (ls) 並不是管線命令的原因啊! [root@www ~]# find /sbin -perm +7000 | xargs ls -l -rwsr-xr-x 1 root root 70420 May 25 2008 /sbin/mount.nfs -rwsr-xr-x 1 root root 70424 May 25 2008 /sbin/mount.nfs4 -rwxr-sr-x 1 root root 5920 Jun 15 2008 /sbin/netreport ....(底下省略)....
參考資料:http://vbird.dic.ksu.edu.tw/linux_basic/0320bash.php#xargs