Linux
如何使用 find 搜尋具有特定副檔名的文件?
我們想
.hprof
在/var
.和有什麼區別
find /var -type f -regex '.*\.hprof' /var/ff-efre-ferg-fr.hprof
和
find /var -type f -name "*.hprof" /var/ff-efre-ferg-fr.hprof
還是搜尋方法完全一樣?
謂詞是標準的
-name
,僅匹配文件名並使用 shell 萬用字元語法。這
-regex
是一個非標準擴展,由一些find
實現支持,但在完整路徑上具有不同的語法和匹配(從此處提供的路徑參數開始/opt
)。預設語法是某種形式的正則表達式。例如,對於 GNU
find
,即 GNUemacs
正則表達式,您可以對-regextype
謂詞使用不同的正則表達式類型。對於某些 BSD,它是標準的基本正則表達式,您可以使用-E
選項(不是謂詞)切換到標準擴展正則表達式。還有另一個標準謂詞:
-path
like-regex
匹配完整路徑,like-name
使用 shell 萬用字元。一些實現還支持一些
-iname
,-ipath
,-iregex
謂詞以不區分大小寫匹配。GNUfind
支持-wholename
替代-path
(rms 對像到單詞路徑,指的是完整的文件名,包括一些目錄組件)。find /opt -type f -regex '.*\.hprof'
和
find /opt -type f -path '*.hprof'
與支持
-regex
. 萬用字元*
和正則表達式(所有變體).*
都表示任意數量的字元。他們可以給出不同的結果
find /opt -type f -name '*.hprof'
對於路徑組件不是名稱的文件,這些文件包含在區域設置中不形成有效字元的字節序列。
$ mkdir $'St\351phane' $ touch $'St\351phane/file.hprof' $ locale charmap UTF-8 $ find . -regex '.*\.hprof' $ find . -path '*.hprof' $ find . -name '*.hprof' ./St?phane/file.hprof
那是一個
Stéphane
目錄,但é
編碼為 iso8859-1 (0351, 0xe9),而不是 UTF-8。在 UTF-8 語言環境中,該 0xe9 字節不映射到字元,因此正則表達式.
或萬用字元*
不匹配(至少與 GNUfind
)。文件的基本名稱 (file.hprof
) 是可以的,所以-name
可以匹配它。最大化便攜性和可靠性的一些經驗法則:
-name
當您只需要匹配文件名而不是它所在的目錄時使用(萬用字元語法就足夠了),就像這裡用於您的擴展*.hprof
搜尋一樣。-path
如果您還需要匹配文件的位置(例如find . -path ./special-dir -prune -o -type f -print
)(並且萬用字元語法就足夠了),請使用。-regex
如果萬用字元不夠,請使用,但請檢查您需要定位的實現中的支持,並註意,正則表達式語法可能不同。如果您只需要匹配文件名,請確保您不使用可以匹配/
.