鍍金池/ 教程/ Linux/ shell 學(xué)習(xí)四十五天---xargs
shell 學(xué)習(xí)四十五天---xargs
shell學(xué)習(xí)第三天
shell 學(xué)習(xí)十五天---join 連接字段
shell 學(xué)習(xí)第二天
shell 學(xué)習(xí)四十三天---臨時(shí)性文件的建立與使用
shell 學(xué)習(xí)第六天---小結(jié)
shell 學(xué)習(xí)三十三天---關(guān)于重定向
shell 學(xué)習(xí)二十九天---循環(huán)
shell 學(xué)習(xí)二十四天---提取開頭或結(jié)尾數(shù)行
shell 學(xué)習(xí)第十天---sed 查找與替換
shell 學(xué)習(xí)第十一天---sed 正則的精確控制
shell 學(xué)習(xí)三十天---break,continue,shift,getopts
shell 學(xué)習(xí)---小結(jié)
shell 學(xué)習(xí)三十一天---函數(shù)問題
shell 學(xué)習(xí)第四天---華麗的 printf 輸出
shell 學(xué)習(xí)三十五天---波浪號(hào)展開與通配符
shell 學(xué)習(xí)十九天---文本塊排序
shell 學(xué)習(xí)十二天---行與字符串
shell 學(xué)習(xí)二十一天---重新格式化段落
shell 學(xué)習(xí)十八天---文本排序
shell 學(xué)習(xí)十三天---sed 案例分析
shell 學(xué)習(xí)四十一天---列出文件 ls 和 od 命令
shell 學(xué)習(xí)十七天---awk 命令
shell 學(xué)習(xí)三十六天---命令替換
shell 學(xué)習(xí)十六天---join 練習(xí)
shell 學(xué)習(xí)三十二天---read 讀取一行
shell 學(xué)習(xí)二十二天---計(jì)算行數(shù),字?jǐn)?shù)以及字符數(shù)
shell 學(xué)習(xí)小總結(jié)---本章小結(jié)
shell 學(xué)習(xí)第八天---擴(kuò)展正則表達(dá)式(ERE)
shell 學(xué)習(xí)四十二天---使用 touch 更新文件時(shí)間
shell 學(xué)習(xí)二十八天---case 語句
shell 學(xué)習(xí)三十九天---內(nèi)建命令
shell 學(xué)習(xí)第一天
shell 學(xué)習(xí)三十四天---printf 詳解
shell 學(xué)習(xí)二十六天---變量與算數(shù)
shell 學(xué)習(xí)三十八天---執(zhí)行順序和 eval
shell 學(xué)習(xí)四十四天---尋找文件
shell 學(xué)習(xí)二十五天---神器的管道符
shell 學(xué)習(xí)十四天---使用 cut 選定字段
shell 學(xué)習(xí)第五天---基本的I/O重定向
shell 學(xué)習(xí)四十天---awk 的驚人表現(xiàn)
shell 學(xué)習(xí)二十天---sort 的其他內(nèi)容以及 uniq 命令
shell 學(xué)習(xí)二十三天---打印
shell 學(xué)習(xí)第九天---分組
shell 學(xué)習(xí)四十八天---文件校驗(yàn)和匹配
shell 學(xué)習(xí)二十七天---退出狀態(tài)和 if 語句
shell 學(xué)習(xí)四十七天---文件比較 cmp,diff,patch
shell 學(xué)習(xí)第七天---基礎(chǔ)正則表達(dá)式(BRE)
shell 學(xué)習(xí)四十六天---文件系統(tǒng)的空間信息 df 和 du 命令
shell 學(xué)習(xí)三十七天---引用
shell 學(xué)習(xí)小結(jié)

shell 學(xué)習(xí)四十五天---xargs

當(dāng) find 產(chǎn)生一個(gè)文件列表時(shí),該列表提供給另一個(gè)命令有時(shí)是很有用的.
案例:

$touch abc.c erd.c oiy.c  
$ll  
./erd.c  
./abc.c  
./oiy.c  
$find -name '*.c'| rm  
rm: 缺少操作數(shù)  
請(qǐng)嘗試執(zhí)行"rm --help"來獲取更多信息。  
$find -name '*.c'| xargs rm  
$find -name '*.c'  

無任何顯示,說明已成功刪除.

  1. 簡(jiǎn)介,之所以能用到這個(gè)命令,關(guān)鍵是由于很多命令不支持管道(|)來傳遞參數(shù),而日常工作中有這個(gè)必要,所以就有了 xargs 命令,如上例.
    xargs 可以讀入 stdin 的資料,并且以空白子元或斷行子元作為分辨,將 stdin 的資料分隔成為 atguments,因?yàn)槭且钥瞻鬃釉鳛榉指?所以,如果有一些文件名或者其他有意義的名詞內(nèi)含空白子元的時(shí)候,xargs 就可能會(huì)出現(xiàn)誤判了.
$touch 'file 1.log' ‘file 2.log’  
$ll  
總用量 0  
-rw-r--r-- 1 root root 0 7月  13 10:18 file 1.log  
-rw-r--r-- 1 root root 0 7月  13 10:18 file 2.log  
$find -name '*.log'  
./file 2.log  
./file 1.log  
$find -name '*.log' | xargs rm  
rm: 無法刪除"./file": 沒有那個(gè)文件或目錄  
rm: 無法刪除"2.log": 沒有那個(gè)文件或目錄  
rm: 無法刪除"./file": 沒有那個(gè)文件或目錄  
rm: 無法刪除"1.log": 沒有那個(gè)文件或目錄  

原因很簡(jiǎn)單,xargs 默認(rèn)是以空白字符(空格,tab,換行符)來分割記錄的,因此文件名 ./file 1.log 被解釋成了兩個(gè)記錄./file 和 1.log,不幸的是 rm 找不到這兩個(gè)文件.
為了解決此類問題,聰明的人類想出了一個(gè)辦法,讓 find 在打印出一個(gè)文件名之后接著輸出一個(gè) null 字符(‘ ’)而不是換行符,然后再告訴 xargs 也用 null 字符來作為記錄的分隔符,這就是 find 的-print 和 xargs 的-0 選項(xiàng).
$find -name '*.log' -print0 | xargs -0 rm

  1. 主要選項(xiàng)
選項(xiàng) 含義
-0 當(dāng) stdin 含有特殊子元的時(shí)候,將其當(dāng)成一般字符
-a file 從文件中讀入作為 stdin
-e flag 注意有的時(shí)候可能會(huì)是-E,flag 必須是一個(gè)以空格分割的標(biāo)志,當(dāng) xargs 分析到含有 flag 這個(gè)標(biāo)志的時(shí)候就停止
-p 當(dāng)每次執(zhí)行一個(gè) argument 的時(shí)候咨詢問一次用戶.
-n num 后面加次數(shù),表示命令在執(zhí)行的時(shí)候一次用 arguments 的個(gè)數(shù),默認(rèn)是用所有的.
-t 便是先打印命令,然后在執(zhí)行
-i 或者是-I,將 xargs 的每項(xiàng)名稱,一般是一行一行的賦值給{},可以用{}代替
-r no-run-if-enpty 當(dāng) xargs 的輸入為空的時(shí)候則停止 xargs,不用再去執(zhí)行了
-s num 命令行的最大字符數(shù)
-d delim 分隔符,默認(rèn)的 xargs 分隔符是回車,argument 的分隔符是空格,這里修改的是 xargs 的分隔符
-x exit 的意思,主要是匹配-s 使用
-P 修改最大的進(jìn)程數(shù),默認(rèn)是 1,為 0 的時(shí)候 as mang as it can

find -print 和-print0 的區(qū)別:
-print 每一個(gè)輸出后會(huì)添加一個(gè)回車換行符,而-print0 則不會(huì).