引子:find . -name "*.csv" | xargs du -ck | grep total
使用find -exec選項處理匹配到的文件時男应,find命令將匹配到的所有文件一起傳遞給exec執(zhí)行
有些系統(tǒng)exec的命令長度有限制祝闻,運行會導致溢出錯誤“參數(shù)列太長”或“參數(shù)列溢出”
exec會為處理每一個匹配到的文件而發(fā)起一個相應的進程页眯,并非將匹配到的文件全部作為參數(shù)一次執(zhí)行宗挥,一些情況下會導致進程過多靶壮,系統(tǒng)性能下降的問題维费,因而效率不高
xargs命令每次只獲取一部分文件而不是全部果元,處理完先獲取的 然后再去繼續(xù)獲取(究竟是一次獲取所有的參數(shù)犀盟,還是分批取得參數(shù)而晒,以及每一次獲取參數(shù)的數(shù)目都會根據(jù)該命令的選項及系統(tǒng)內核中相應的可調參數(shù)來確定。)
xargs只有一個進程阅畴,保證系統(tǒng)性能
使用實例:
1.查找系統(tǒng)中的每一個普通文件倡怎,然后使用xargs命令來測試他們分別屬于哪類文件
find . -type f -print | xargs file
2.在整個系統(tǒng)中查找內存信息存儲文件(core dump),然后把結果保存到/tmp/core.log文件中
find / -name "core" -print | xargs echo "" > /tmp/core.log
3.在當前目錄下查找所有用戶具有讀贱枣、寫和執(zhí)行權限的文件监署。并收回相應的寫權限
find . -perm -7 -print | xargs chmod o-w
4.用grep命令在所有的普通文件中搜索hostname這個詞
find . -type f -print | xargs grep "hostname"
5.用grep命令在當前目錄下的所有普通文件中搜索hostnames這個詞
find . -name * -type f -print | xargs grep "hostnames"
(注意,在上面的例子中纽哥, \用來取消find命令中的*在shell中的特殊含義钠乏。)
6.使用xargs執(zhí)行mv
find . -name "*.log" | xargs -i mv {} test4
7.find后執(zhí)行xargs提示xargs:argument line too long解決方法:
find . -type f -atime +0 -printf0 | xargs -0 -11 -t rm -f
find . -type f -atime +0 -print0 | xargs -0 -l1 -t rm -f
rm -f
-l1是一次處理一個;-t是處理之前打印出命令
8.使用-i參數(shù)默認的前面輸出用{}代替春塌,-I參數(shù)可以指定其他代替代替字符晓避,如例子中的[]
find . -name "file" | xargs -I [] cp [] ..
9.xargs的-p參數(shù)的使用
find . -name "*.log" | xargs -p -i mv {} ..
-p參數(shù)會提示讓你確認是否執(zhí)行后面的命令,y執(zhí)行,n不執(zhí)行摔笤。