http://m.blog.csdn.net/article/details?id=44875865
為啥要xargs?
通常linux命令可以用|
首尾相連,上一個命令的 stdout 連接到下一個命令的 stdin。但是有些命令,比如ls
、rm
等,是從命令行參數接受輸入的。這時候如果想把上一個命令的輸出傳給它們,就不好辦了。所以就有了xargs
。
簡單而言,xargs
可以把從 stdin 接受到的輸入,用空白符分隔開,然后依次作為參數去調用xargs
后面的命令。
用法
舉個例子,想把所有.jpg
文件刪除,當然你可以rm *.jpg
,但是如果要遞歸操作所有子目錄下的文件呢?
可以這樣:
find . -name "*.jpg" | xargs rm
- 1
這樣,所有被find
找到的文件名,都會作為參數來調用rm
命令了。
對於大多數情況,這一行命令沒有問題,但是如有些文件名中包含空格,就會有問題了。xargs
默認以空白符分隔接受到的輸入,所以一個含有空格的文件名會被當做多個參數,分別傳給rm
。所以在處理文件名這類命令時,通常要這樣:
find . -name "*.jpg" -print0 | xargs -0 rm
- 1
這里的-print0
是告訴find
命令,在每個輸出后面以'\0'
作為結束。-0
是告訴xargs
,使用'\0'
來分隔輸入,而不是空白符。這樣就避免出現問題了。
下面再考慮另一種情況,假設不是刪除,而是想把符合要求的文件名都添加上后綴.bak
怎么辦?這時候需要這樣:
find . -name "*.jpg" -print0 | xargs -0 -I {} mv {} {}.bak
- 1
其中的-I {}
是告訴xargs
,后面的命令中,用{}
表示占位符,將會被實際的參數替代。這樣就行了。
其他有用的參數還有: -n
用於指定每次傳遞幾個參數 -d
用於指定切分輸入內容時,具體的分隔符
其他更多的參數,就參考man xargs
吧。