Linux

按長度過濾查找結果

  • May 18, 2022

我想在單個目錄中找到所有子目錄。我需要按名稱長度過濾。我想出了以下幾點:

find ./directory -maxdepth 1 -type d

如何按名稱長度過濾結果——例如,只有超過 4 個字元的子目錄?

您可以使用?萬用字元五次:

find ./directory -maxdepth 1 -type d -name '?????*'

這要求匹配項的名稱中至少包含五個字元。

使用zshshell,glob 可以使用glob qualifiers按文件類型(此處為directory)過濾,並且使用該選項,您將獲得一個類似於 ERE 的 glob 運算符,因此您可以執行以下操作:extendedglob``(#cX,Y)``{X,Y}

set -o extendedglob
print -rC1 -- ?(#c5,)(ND/)

print raw on 1 Column由或多個字元 ( ) 組成的目錄類型( /glob 限定符)的文件。5``?

?(#c5,12)將是 5 到 12 個字元,?(#c,5)?(#c0,5)0 到 5 個字元(不是說您可以獲得包含 0 個字元的文件名)。

D如果要忽略隱藏的限定符,請刪除限定符。

對於zshglob,任何無法解碼為字元的字節仍被視為一個(並將由 匹配?)。

對於包括 GNU 在內的某些find實現find,至少在 GNU 系統上(使用 GNU regex /fnmatch()來自 GNU libc),它們既不匹配?也不 匹配*(也不匹配 regex .),因此:

find . -maxdepth -name '?????*' -type d

或者

find . -maxdepth 1 -regextype posix-extended -regex '.*/[^/]{5,}' -type d

$'St\xe9phane'例如,如果在 UTF-8 語言環境中執行,則將無法匹配目錄,因為 0xe9 字節(ISO8859-1 é)無法解碼為字元,並且除了在下執行之外沒有其他解決方法findLC_ALL=C但是您以字節為單位計算長度而不是人物。

與該 BSD 等效的-regex是:

find -E . -maxdepth 1 -regex '.*/[^/]{5,}'

或者

find . -maxdepth 1 -regex '.*/[^/]\{5,\}'

(預設是基本的正則表達式,而對於 GNU find,它是一些舊的 emacs 正則表達式方言)。

請記住,多字節字元支持會因變體而異。

如果在 GNU 系統上,另一種方法是find輸出以 NUL 分隔的文件路徑(基於 NUL 是文件路徑中唯一找不到的字元)並按gawk其名稱的長度進行過濾:

find . -mindepth 1 -maxdepth 1 -printf '%P\0' |
 gawk -v RS='\0' -F/ 'length($NF) > 4'

如果存在無法解碼為字元的字節,則會gawk發出警告,但這些字節中的每一個都對長度貢獻 1,如zsh.

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