Linux

如何使用 find 搜尋具有特定副檔名的文件?

  • December 9, 2019

我們想.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選項(不是謂詞)切換到標準擴展正則表達式。

還有另一個標準謂詞:-pathlike-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 字節不映射到字元,因此正則表達式.或萬用字元*不匹配(至少與 GNU find)。文件的基本名稱 ( file.hprof) 是可以的,所以-name可以匹配它。

最大化便攜性和可靠性的一些經驗法則:

  • -name當您只需要匹配文件名而不是它所在的目錄時使用(萬用字元語法就足夠了),就像這裡用於您的擴展*.hprof搜尋一樣。
  • -path如果您還需要匹配文件的位置(例如find . -path ./special-dir -prune -o -type f -print)(並且萬用字元語法就足夠了),請使用。
  • -regex如果萬用字元不夠,請使用,但請檢查您需要定位的實現中的支持,並註意,正則表達式語法可能不同。如果您只需要匹配文件名,請確保您不使用可以匹配/.

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