執(zhí)行命令: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ù) 請嘗試執(zhí)行 "rm --help" 來獲取更多信息。 $find -name '.c'| xargs rm $find -name '*.c'
無任何顯示,說明已成功刪除。
1. 簡介,之所以能用到這個(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è)文件或目錄
- 原因很簡單,`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`
2. 主要選項(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ì)。