執(zhí)行命令:xargs
當 find 產(chǎn)生一個文件列表時,該列表提供給另一個命令有時是很有用的。
案例:
```$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. 簡介,之所以能用到這個命令,關鍵是由于很多命令不支持管道 (|) 來傳遞參數(shù),而日常工作中有這個必要,所以就有了 xargs 命令,如上例。
xargs 可以讀入 stdin 的資料,并且以空白子元或斷行子元作為分辨,將 stdin 的資料分隔成為 atguments,因為是以空白子元作為分隔,所以,如果有一些文件名或者其他有意義的名詞內(nèi)含空白子元的時候,xargs 就可能會出現(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":沒有那個文件或目錄 rm:無法刪除 "2.log":沒有那個文件或目錄 rm:無法刪除 "./file":沒有那個文件或目錄 rm:無法刪除 "1.log":沒有那個文件或目錄
- 原因很簡單,`xargs` 默認是以空白字符 (空格,tab,換行符) 來分割記錄的,因此文件名 `./file 1.log` 被解釋成了兩個記錄`./file` 和 `1.log`,不幸的是 `rm` 找不到這兩個文件。
- 為了解決此類問題,聰明的人類想出了一個辦法,讓 `find` 在打印出一個文件名之后接著輸出一個 `null` 字符 (' ') 而不是換行符,然后再告訴 `xargs` 也用 `null` 字符來作為記錄的分隔符,這就是 `find` 的 `-print 和 xargs` 的 `-0` 選項。
`$find -name '*.log' -print0 | xargs -0 rm`
2. 主要選項
選項 含義 -0 當 stdin 含有特殊子元的時候,將其當成一般字符 -a file 從文件中讀入作為 stdin -e flag 注意有的時候可能會是 -E,flag 必須是一個以空格分割的標志,當 xargs 分析到含有 flag 這個標志的時候就停止 -p 當每次執(zhí)行一個 argument 的時候咨詢問一次用戶。 -n num 后面加次數(shù),表示命令在執(zhí)行的時候一次用 arguments 的個數(shù),默認是用所有的。 -t 便是先打印命令,然后在執(zhí)行 -i 或者是 -I,將 xargs 的每項名稱,一般是一行一行的賦值給 {},可以用 {} 代替 -r no-run-if-enpty 當 xargs 的輸入為空的時候則停止 xargs,不用再去執(zhí)行了 -s num 命令行的最大字符數(shù) -d delim 分隔符,默認的 xargs 分隔符是回車,argument 的分隔符是空格,這里修改的是 xargs 的分隔符 -x exit 的意思,主要是匹配 -s 使用 -P
修改最大的進程數(shù),默認是 1,為 0 的時候 as mang as it can
find -print 和 -print0 的區(qū)別:
- `-print` 每一個輸出后會添加一個回車換行符,而 `-print0` 則不會。