Find

僅使用 find 查找前幾個匹配的文件?

  • October 31, 2021

假設一個目錄中可能有數百個*.txt文件。我只想找到前三個*.txt文件,然後退出搜尋過程。

如何使用該find實用程序實現此目的?我快速瀏覽了它的手冊頁,似乎不是這樣的選擇。

find您可以通過管道輸出的輸出head

find . -name '*.txt' | head -n 3

這個另一個答案有些缺陷。命令是

find . -name '*.txt' | head -n 3

然後在其中一個評論中有解釋

$$ emphasis mine $$:

head啟動並等待來自管道左側的輸入。然後find啟動並蒐索符合指定條件的文件,並通過管道發送其輸出。當head收到並列印請求的行數時,它終止,關閉管道。**find注意到關閉的管道,它也終止了。**簡單、優雅、高效

幾乎是真的。

**問題是find只有在嘗試寫入時才注意到關閉的管道 - 在這種情況下,它是在找到第 4 個匹配項時。但如果沒有第四場比賽,那麼find將繼續。你的外殼會等待!**如果它發生在腳本中,腳本將等待,儘管我們已經知道管道輸出是最終的,並且無法添加任何內容。效率不高。

如果此特定操作find自行快速完成,但在大型文件樹中進行複雜搜尋,則該命令可能會不必要地延遲您接下來想要執行的任何操作,則效果可以忽略不計。

不太完美的解決方案是執行

( find … & ) | head -n 3

這樣,當head退出時,shell 會立即繼續。後台find程序可能會被忽略(它遲早會退出)或以pkill或其他東西為目標。


為了證明你可以搜尋的概念/。我們只期待一場比賽,但find到處尋找它,這可能需要很多時間。

find / -wholename / 2>/dev/null | head -n 1

看到問題後立即用Ctrl+終止它。C現在比較:

pidof find ; ( find / -wholename / 2>/dev/null & ) | head -n 1 ; pidof find

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