2009年4月15日 星期三

linux指令 - xargs

$ xargs [-0epn] command
參數:
-0 :如果輸入的 stdin 含有特殊字元,例如 `, \, 空白鍵等等字元時,這個 -0 參數
可以將他還原成一般字元。這個參數可以用於特殊狀態喔!
-e :這個是 EOF (end of file) 的意思。後面可以接一個字串,當 xargs 分析到
這個字串時,就會停止繼續工作!
-p :在執行每個指令的 argument 時,都會詢問使用者的意思;
-n :後面接次數,每次 command 指令執行時,要使用幾個參數的意思。看範例三。
當 xargs 後面沒有接任何的指令時,預設是以 echo 來進行輸出喔!


這一個指令的好處在於,並不是每一個指令均可以使用管線命令,而透過xargs就可以讓這一些不支援管線命令的程式,可以使用前一個指令完成之後的結果。
例如鳥哥舉的一個例子:

找出 /sbin 底下具有特殊權限的檔名,並使用 ls -l 列出詳細屬性
$ find /sbin -perm +7000 | ls -l
# 結果竟然僅有列出目前所在目錄下的檔案!這不是我們要的!
# 因為 ll (ls) 並不是管線命令的原因啊!


$ 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
....(底下省略)....


但是,若管線前面沒有資料送過來,後面的指令會因為沒有參數可以執行,會出現錯誤。
這個時候,就要使用--no-run-if-empty參數啦~
例:
$ find -iname "*.bak" | xargs --no-run-if-empty rm

$ find -iname "*.bak" | xargs -i cp {} ~/bakdir
使用 -i 和 {} 就可以把前面所得到的輸出列表,不是一整串,而是一個一個地傳給後面的指令
上述的指令的效果就像是這樣…

參考資料:
鳥哥的私房菜
xargs應用介紹

沒有留言: