xargs的用法

處理帶有空格的文件名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
相關文章
相關標籤/搜索