2010-02-01 93 views
10

当使用find命令,那为什么下面将成功地忽略隐藏目录(那些刚开始有一段时间),同时匹配一切:与GNU忽略/剪枝隐藏目录find命令

find . -not \(-type d -name ".?*" -prune \)

但这根本不匹配任何东西:

find . -not \(-type d -name ".*" -prune \)

唯一的区别是问号。不应该后者命令同样检测并排除以句点开头的目录吗?

+0

属于superuser.com – t0mm13b 2010-02-01 02:22:59

+3

@tommie - 是吗?取决于它是交互式使用还是作为脚本的一部分使用;在后一种情况下,这可能是一个合理的软件开发问题。 – 2010-02-01 02:35:51

+0

因所选答案中的“GNU find”的标题提及不相关而被低估。 – danorton 2013-03-06 18:20:27

回答

8

后者命令修剪一切,因为它修剪. - 尝试这些看出区别:

$ ls -lad .* 
. 
.. 
.dotdir 
$ ls -lad .?* 
.. 
.dotdir 

你看到的是,在第二个,.不包括在内,因为它只有一个字符。 glob“.?*”仅包含至少两个字符长的文件名(点,加上任何单个字符,非可选,以及任何零或多个字符的序列)。

顺便说一下,find不是Bash命令。

+0

“发现不是Bash命令” - 很好的调用,改变了标题以反映这个 – kostmo 2010-02-11 04:27:55

2

后一个命令将修剪.本身 - 您正在运行的目录find反对 - 这就是为什么它不会产生任何结果。

+0

认为你的意思是“后者” – kostmo 2010-02-11 04:29:01