0

我有以下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

4 回答 4

2

因为 find 搜索文件,并且找到的文件都没有在其名称中包含搜索模式(请参阅手册页)。您需要通过-prune开关删除有问题的目录:

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

请参阅从 find 中排除目录。命令

-prune[编辑]没有(更自然的恕我直言)的替代方案:

find . -not -path "*git*" -not -name '*git*' |grep git
于 2013-10-18T22:36:17.073 回答
1

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

$ shopt -s extglob
$ find !(.git)
于 2013-10-18T22:33:16.060 回答
1

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

尝试-iwholename代替-name
find . ! -iwholename '*git*'

于 2013-10-18T22:34:15.610 回答
0

这就是我需要的:

find . ! -path '*git*'
于 2013-10-18T22:46:24.683 回答