我有以下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
答案 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*'