Bash

查找 -exec + 與查找 |xargs:選擇哪一個?

  • February 21, 2019

我知道-exec可以+選擇模仿xargs. 在任何情況下,您更喜歡一種形式而不是另一種形式?

我個人傾向於更喜歡第一種形式,即使只是為了避免使用管道。我想肯定開發人員find必須進行適當的優化。我對麼?

您可能希望連結呼叫以查找(曾經,當您了解到這是可能的,可能是今天)。當然,這只有在您留在 find 中時才有可能。一旦您通過管道傳輸到 xargs,它就超出了範圍。

小例子,兩個文件 a.lst 和 b.lst:

cat a.lst
fuddel.sh
fiddel.sh

cat b.lst
fuddel.sh

這裡沒有技巧 - 只是兩個都包含“fuddel”但只有一個包含“fiddel”的事實。

假設我們不知道這一點。我們搜尋一個符合 2 個條件的文件:

find -exec grep -q fuddel {} ";" -exec grep -q fiddel {} ";" -ls
192097    4 -rw-r--r--   1 stefan   stefan         20 Jun 27 17:05 ./a.lst

好吧,也許您知道 grep 或其他程序將兩個字元串作為條件傳遞的語法,但這不是重點。每個可以返回真或假的程序,給定一個文件作為參數,都可以在這裡使用 - grep 只是一個流行的例子。

請注意,您可以在 find -exec之後使用其他查找命令,例如**-ls-delete**或類似的東西。請注意, delete 不僅 rm (刪除文件),而且 rmdir (刪除目錄)。

這樣的鏈被讀取為命令的 AND 組合,只要沒有另外指定(即使用-or開關(和括號(需要屏蔽)))。

所以你不會離開查找鏈,這是一件方便的事情。我沒有看到使用 -xargs 的任何優勢,因為您必須小心傳遞文件,這是 find 不需要做的事情 - 它會自動處理將每個文件作為單個參數傳遞給您。

如果您認為需要對 find {} 大括號進行一些掩蔽,請隨時訪問我的問題,該問題要求提供證據。我的斷言是:你沒有。

將文件名安全地傳遞到xargs需要您find支持該-print0選項並且您xargs有相應的選項來讀取它(--null-0)。否則,名稱中包含不可列印字元或反斜杠或引號或空格的文件名可能會導致意外行為。另一方面,find -exec {} +它在POSIXfind規範中,所以它是可移植的,它和 . 一樣安全find -print0 | xargs -0,而且絕對比find | xargs. 我建議永遠不要find | xargs沒有-print0.

引用自:https://unix.stackexchange.com/questions/41740