處理帶有空格的文件名linux
#咱們建立了3個日誌文件, 且故意讓文件名稱中都含有空格 [roc@roclinux ~]$ for((i=0;i<3;i++)); do touch "test ${i}.log";done
#咱們列出建立的文件 [roc@roclinux ~]$ ls -1F test 0.log test 1.log test 2.log
xargs 提供了-0
選項,容許將 NULL 做爲分隔符,而 find 命令也心有靈犀地提供了對應的選項來產生以 NULL 字符做爲分隔符的輸出。
find 命令提供的對應方法是 -print0 選項,在文件名以後輸出 NULL,而不像 -print 選項那樣輸出換行符(換行符會被 xargs 替換成空格)。bash
[roc@roclinux ~]$ find . -name '*.log' -print0 | xargs -0 rm -f
須要用戶確認spa
若是在前一個命令的標準輸出中,會有一些參數是你不但願或者不肯定是否要傳送給後面命令的,這個時候咱們就但願 xargs 在傳送參數前和咱們確認一下。而-p
選項剛好能夠實現這個願望,咱們能夠輸入 y 或者 n 來選擇是否要執行當前命令: 日誌
[roc@roclinux ~]$ find . -type f |xargs -p rm -f rm -f ./china.txt ./usa.txt ./japan.txt ?...n
每一條都須要詢問:code
[roc@roclinux 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 便終止退出:blog
[roc@roclinux ~]$ echo "china usa korea japan" > country.list [roc@roclinux ~]$ cat country.list china usa korea japan [roc@roclinux ~]$ cat country.list | xargs -E 'korea' echo china usa
咱們來模擬一個這樣的場景,新建 10 萬個日誌文件,而且嘗試用 rm 命令一次性刪除:get
[roc@roclinux ~]$ for((i=0;i<100000;i++)); do touch test${i}.log;done [roc@roclinux ~]$ rm $(find . -type f -name '*.log') -bash: /bin/rm: Argument list too long
出現了「Argument list too long」報錯,這說明 rm 可接受的參數長度達到了極限。這其實並不是 rm 的錯,而是系統限制了參數的長度。經過下面的命令能夠查看到系統的參數長度限制值:class
[roc@roclinux ~]$ getconf ARG_MAX 2621440
[roc@roclinux ~]$ find . -name '*.log' -print | xargs rm
把*.txt的文件重命名爲*.txt.baktest
ls *.txt |xargs -t -i mv {} {}.bak
查找文件並壓縮cli
這樣就把「jpg」的文件壓縮了。
find / -name *.jpg -type f -print | xargs tar -cvzf images.tar.gz