天天看點

xargs的用法

處理帶有空格的檔案名

#我們建立了3個日志檔案, 且故意讓檔案名稱中都含有空格
[[email protected] ~]$ for((i=0;i<3;i++)); do touch "test ${i}.log";done      
#我們列出建立的檔案
[[email protected] ~]$ ls -1F
test 0.log
test 1.log
test 2.log      

xargs 提供了

-0

選項,允許将 NULL 作為分隔符,而 find 指令也心有靈犀地提供了對應的選項來産生以 NULL 字元作為分隔符的輸出。

find 指令提供的對應方法是 -print0 選項,在檔案名之後輸出 NULL,而不像 -print 選項那樣輸出換行符(換行符會被 xargs 替換成空格)。

[[email protected] ~]$ find . -name '*.log' -print0 | xargs -0 rm -f      

需要使用者确認

如果在前一個指令的标準輸出中,會有一些參數是你不希望或者不确定是否要傳送給後面指令的,這個時候我們就希望 xargs 在傳送參數前和我們确認一下。而

-p

選項恰好可以實作這個願望,我們可以輸入 y 或者 n 來選擇是否要執行目前指令: 

[[email protected] ~]$ find . -type f |xargs -p rm -f
rm -f ./china.txt ./usa.txt ./japan.txt ?...n      

每一條都需要詢問:

[[email protected] 20160408]$ find . -type f |xargs -p -n 1 rm -f
rm -f ./china.txt ?...n
rm -f ./usa.txt ?...y
rm -f ./japan.txt ?...n      

遇到就停止

比如,我們正在處理一份日志檔案 country.list 中的内容,将日志檔案中的字元以空行作為分隔符依次 echo 出來,一旦遇到 korea 便終止退出:

[[email protected] ~]$ echo "china usa korea japan" > country.list
 
[[email protected] ~]$ cat country.list
china usa korea japan
 
[[email protected] ~]$ cat country.list | xargs -E 'korea' echo
china usa      

你可能一生都不會遇到的參數過長報錯

我們來模拟一個這樣的場景,建立 10 萬個日志檔案,并且嘗試用 rm 指令一次性删除:

[[email protected] ~]$ for((i=0;i<100000;i++)); do touch test${i}.log;done
 
[[email protected] ~]$ rm $(find . -type f -name '*.log')
-bash: /bin/rm: Argument list too long      

出現了“Argument list too long”報錯,這說明 rm 可接受的參數長度達到了極限。這其實并非 rm 的錯,而是系統限制了參數的長度。通過下面的指令可以檢視到系統的參數長度限制值:

[[email protected] ~]$ getconf ARG_MAX
2621440      
[[email protected] ~]$ find . -name '*.log' -print | xargs rm      

把*.txt的檔案重命名為*.txt.bak

ls *.txt |xargs -t -i  mv {} {}.bak      

查找檔案并壓縮

這樣就把“jpg”的檔案壓縮了。

find / -name *.jpg -type f -print | xargs tar -cvzf images.tar.gz      

轉載于:https://www.cnblogs.com/snow-backup/p/11344544.html