为什么找到.git目录?

时间:2013-10-18 22:23:16

标签: bash find

我有以下find命令,我很惊讶地发现.git目录。为什么呢?

$ find . ! -name '*git*' | grep git 
./.git/hooks
./.git/hooks/commit-msg
./.git/hooks/applypatch-msg.sample
./.git/hooks/prepare-commit-msg.sample
./.git/hooks/pre-applypatch.sample
./.git/hooks/commit-msg.sample
./.git/hooks/post-update.sample

4 个答案:

答案 0 :(得分:2)

因为find搜索文件而找不到找到的文件名称中都有搜索模式(参见手册页)。您需要通过-prune开关删除违规目录:

find . -path ./.git -prune -o -not -name '*git*' -print |grep git

请参阅Exclude directory from find . command

[edit]没有-prune的替代品(以及更自然的imho):

find . -not -path "*git*" -not -name '*git*' |grep git

答案 1 :(得分:1)

您只是看到find的预期行为。 -name测试仅适用于文件名本身,而不是整个路径。如果您要搜索.git目录以外的所有内容,可以使用bash(1)extglob选项:

$ shopt -s extglob
$ find !(.git)

答案 2 :(得分:1)

它并没有真正找到那些git文件。相反,它会在./.git/下找到与模式! -name '*git*'匹配的文件,其中包含文件名中不包含git的所有文件(不是路径名)。
查找-name是关于文件,而不是路径。

尝试-iwholename而不是-name
find . ! -iwholename '*git*'

答案 3 :(得分:0)

这就是我需要的:

find . ! -path '*git*'