Find

第一次匹配後如何停止查找命令?

  • December 26, 2021

有沒有辦法find在找到第一個匹配項後強制命令停止?

使用 GNU 或 FreeBSD find,您可以使用-quit謂詞:

find . ... -print -quit

NetBSDfind等價物:

find . ... -print -exit

如果您所做的只是列印名稱,並假設文件名不包含換行符,您可以這樣做:

find . ... -print | head -n 1

這不會find在第一場比賽后停止,但可能取決於第二場比賽或(很多)之後的時間和緩衝。基本上,find當它嘗試輸出某些東西而head已經消失時,它將以 SIGPIPE 終止,因為它已經讀取並顯示了輸入的第一行。

請注意,並非所有 shell 在返回後都會等待該find命令。headBourne shell 和 AT&T 實現ksh(非互動時)和yash(僅當該管道是腳本中的最後一個命令時)不會,使其在後台執行。如果您希望在任何 shell 中看到這種行為,您可以隨時將上面的內容更改為:

(find . ... -print &) | head -n 1

如果您所做的不僅僅是列印找到的文件的路徑,您可以嘗試這種方法:

find . ... -exec sh -c 'printf "%s\n" "$1"; kill -s PIPE "$PPID"' sh {} \;

(替換printf為您將對該文件執行的任何操作)。

這具有返回退出狀態的副作用,find反映了它被殺死的事實。

我們發送的是 SIGPIPE 信號而不是預設的 SIGTERM 以避免在管道的一部分被信號殺死時某些 shell 顯示的消息。他們通常不會因為 SIGPIPE 的死亡而這樣做,因為這些是自然發生的(就像find | head上面一樣……)。

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