按長度過濾查找結果
我想在單個目錄中找到所有子目錄。我需要按名稱長度過濾。我想出了以下幾點:
find ./directory -maxdepth 1 -type d
如何按名稱長度過濾結果——例如,只有超過 4 個字元的子目錄?
您可以使用
?
萬用字元五次:find ./directory -maxdepth 1 -type d -name '?????*'
這要求匹配項的名稱中至少包含五個字元。
使用
zsh
shell,glob 可以使用glob qualifiers按文件類型(此處為directory)過濾,並且使用該選項,您將獲得一個類似於 ERE 的 glob 運算符,因此您可以執行以下操作:extendedglob``(#cX,Y)``{X,Y}
set -o extendedglob print -rC1 -- ?(#c5,)(ND/)
要
r
aw on1
C
olumn由或多個字元 ( ) 組成的目錄類型(/
glob 限定符)的文件。5``?
?(#c5,12)
將是 5 到 12 個字元,?(#c,5)
或?(#c0,5)
0 到 5 個字元(不是說您可以獲得包含 0 個字元的文件名)。
D
如果要忽略隱藏的限定符,請刪除限定符。對於
zsh
glob,任何無法解碼為字元的字節仍被視為一個(並將由 匹配?
)。對於包括 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é
)無法解碼為字元,並且除了在下執行之外沒有其他解決方法find
,LC_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
.