處理帶有空格的檔案名
#我們建立了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