我想在 Linux 机器上找到一个名称为 2 或 3 个字符长的隐藏文件。
我试过:
ls .?[a-zA-Z][a-zA-Z]
ls .??[a-zA-Z]
我也尝试过find . -name "???"
,find . -name "??"
但它只显示分别包含 3 个和 2 个字符的文件名。
答案1
隐藏的文件名始终以点开头。两个字符长的隐藏文件名(包括初始点)将与 , 匹配.?
,而.??
三个字符长的隐藏文件名将匹配。
假设您想要以下名称常规文件,而不是目录和其他文件类型,那么您就可以使用
find . -type f \( -name '.?' -o -name '.??' \)
这将找到当前目录中或当前目录下的常规文件,其名称被隐藏且长度为两个或三个字符。
如果您使用的是bash
shell,并且只对当前目录中的名称感兴趣:
shopt -s nullglob
for name in .? .??; do [[ -f $name ]] && printf '%s\n' "$name"; done
这将循环遍历与两种模式之一匹配的所有名称(如果有的话),并打印出与常规文件或常规文件的符号链接相对应的名称。
设置nullglob
shell 选项bash
可确保模式在不匹配任何名称时被完全删除,而不是保持未展开状态。
通过extglob
在 中设置 shell 选项bash
,这两个模式.?
和.??
可以组合成.@(?|??)
(或者可能是.??(?)
,但这有点混乱)。
在zsh
shell 中,您可以通过 glob 限定符使模式仅匹配常规文件,因此不需要该循环:
printf '%s\n' .(?|??)(.)
这里,(.)
是 globbing 限定符,它将名称匹配限制为仅常规文件。
答案2
find
Bash CentOS 8 中的GNU版本 4.6.0:
find . -type f -name '.??' -o -name '.???'
这将找到包含两个或三个字符的隐藏文件。
如果您将 算作.
字符之一:
find . -type f -name '.?' -o -name '.??'