2013-10-18 83 views
0

我有以下find命令,我很驚訝地看到.git目錄被發現。爲什麼?爲什麼找到.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 
+2

謂詞適用於最後一個元素t只有路徑名。 – Ingo

+0

這個問題似乎是無關緊要的,因爲它是關於Bash的,並且會更適合[unix.se]。 –

回答

2

因爲找到的文件搜索,沒有找到的文件在其名稱中搜索模式(參見手冊頁)。你需要通過-prune開關,刪除違規的目錄:

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

Exclude directory from find . command

[編輯]沒有-prune(和更自然恕我直言)的替代:

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

您剛剛看到預期的行爲find-name測試僅適用於文件名本身,而不是整個路徑。如果你想搜索一切,但.git目錄,你可以使用bash(1)extglob選項:

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

它並沒有真正找到那些混帳文件。相反,它會在./.git/下找到與! -name '*git*'模式相匹配的文件,其中包括文件名中不包含git的所有文件(不包括路徑名)。
查找-name是關於文件,而不是路徑。

嘗試-iwholename而不是-name
find . ! -iwholename '*git*'

0

這是什麼我需要:

find . ! -path '*git*' 
相關問題