LearningLinux Asked: 2022-05-18 12:01:14 +0800 CST2022-05-18 12:01:14 +0800 CST 2022-05-18 12:01:14 +0800 CST 按长度过滤查找结果 772 我想在单个目录中找到所有子目录。我需要按名称长度过滤。我想出了以下几点: find ./directory -maxdepth 1 -type d 如何按名称长度过滤结果——例如,只有超过 4 个字符的子目录? linux find 2 个回答 Voted Best Answer Jeff Schaller 2022-05-18T12:06:04+08:002022-05-18T12:06:04+08:00 您可以使用?通配符五次: find ./directory -maxdepth 1 -type d -name '?????*' 这要求匹配项的名称中至少包含五个字符。 Stéphane Chazelas 2022-05-18T13:13:07+08:002022-05-18T13:13:07+08:00 使用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 é)无法解码为字符,并且除了在下运行之外没有其他解决方法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.
您可以使用
?
通配符五次:这要求匹配项的名称中至少包含五个字符。
使用
zsh
shell,glob 可以使用glob qualifiers按文件类型(此处为directory)过滤,并且使用该选项,您将获得一个类似于 ERE 的 glob 运算符,因此您可以执行以下操作:extendedglob
(#cX,Y)
{X,Y}
要
print
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.
),因此:或者
$'St\xe9phane'
例如,如果在 UTF-8 语言环境中运行,则将无法匹配目录,因为 0xe9 字节(ISO8859-1é
)无法解码为字符,并且除了在下运行之外没有其他解决方法find
,LC_ALL=C
但是您以字节为单位计算长度而不是人物。与该 BSD 等效的
-regex
是:或者
(默认是基本的正则表达式,而对于 GNU
find
,它是一些旧的 emacs 正则表达式方言)。请记住,多字节字符支持会因变体而异。
如果在 GNU 系统上,另一种方法是
find
输出以 NUL 分隔的文件路径(基于 NUL 是文件路径中唯一找不到的字符)并按gawk
其名称的长度进行过滤:如果存在无法解码为字符的字节,则会
gawk
发出警告,但这些字节中的每一个都对长度贡献 1,如zsh
.