當(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'
無任何顯示,說明已成功刪除.
$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
選項(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ì).