我的目标是查找文件系统中以点 ( .
) 开头的所有文件或目录,例如.gnupg
。所以我想出了这个命令:
find -name '.*'
在网上查了一下,我看到一些提示说我应该使用[.]*
replace作为-name
option的参数值。由于结果看起来相同,这两种方法有什么区别?
答案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]*'
.我不太清楚为什么你不能直接说'\.(.*)'
,但我确信有人有建议。