Find
僅使用 find 查找前幾個匹配的文件?
假設一個目錄中可能有數百個
*.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