命令“find -name”的 [.]* 和“.*”有什么区别?

命令“find -name”的 [.]* 和“.*”有什么区别?

我的目标是查找文件系统中以点 ( .) 开头的所有文件或目录,例如.gnupg。所以我想出了这个命令:

find -name '.*'

在网上查了一下,我看到一些提示说我应该使用[.]*replace作为-nameoption的参数值。由于结果看起来相同,这两种方法有什么区别?

答案1

完全没有区别。如果你试试:

$ diff <(find -name '.*') <(find -name '[.]*')

你没有得到任何输出。这意味着命令输出是相同的。我认为你断章取义了这个“暗示”。意图可能有所不同。

find手册页:

-name pattern
文件名的基础(删除了前导目录的路径)与 shell 模式pattern 匹配。基本名称开头的元字符(*',?' 和.'(这是 findutils-4.2.2 中的更改)[]') match a

意味着[]-name参数中被解释为字符类。除了.其中什么都没有,它匹配一个文字.,就好像您没有使用[].

答案2

对于 glob 模式来说,没有区别。.*是一个字面句点,后跟零个或多个字符。[.]*是括号内的任意一个字符(在本例中,它必须是字面句号),后跟零个或多个字符。

长相相似的常用表达 .*并且[.]*是不同的。第一个是任何单个字符出现零次或多次,而第二个是文字句点出现零次或多次。是.正则表达式元字符,但不在方括号内,按字面意思处理。

答案3

怎么样

'\.[a-z]*'

该表达式需要一个文字点,后跟任意数量的字母字符。在快速测试中它似乎对我有用。您需要反斜杠来转义点。它通常是一个元字符,表示“任何字符”(或多或少)。

我整个表情都是

find ~/ -name '\.[a-z]*'

编辑:要包含以数字开头的点文件,请尝试'\.[a-z0-9]*'.我不太清楚为什么你不能直接说'\.(.*)',但我确信有人有建议。

相关内容