Find
第一次匹配後如何停止查找命令?
有沒有辦法
find
在找到第一個匹配項後強制命令停止?
使用 GNU 或 FreeBSD
find
,您可以使用-quit
謂詞:find . ... -print -quit
NetBSD
find
等價物:find . ... -print -exit
如果您所做的只是列印名稱,並假設文件名不包含換行符,您可以這樣做:
find . ... -print | head -n 1
這不會
find
在第一場比賽后停止,但可能取決於第二場比賽或(很多)之後的時間和緩衝。基本上,find
當它嘗試輸出某些東西而head
已經消失時,它將以 SIGPIPE 終止,因為它已經讀取並顯示了輸入的第一行。請注意,並非所有 shell 在返回後都會等待該
find
命令。head
Bourne 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
上面一樣……)。