我想找到foo
SVN 維護的大型檔案系統中所有出現的情況,但我不想匹配任何.svn
目錄中包含的任何內容。
當我這樣做時,我會立即得到匹配,但是當我嘗試使用命令grep -l -e 'foo' *
排除 svn 目錄時,就會掛起。grep -l -e 'foo' --exclude-dir=".svn"
我究竟做錯了什麼?
答案1
--exclude-dir
不取代在命令列上列出文件的需要。您正在“掛起”,因為grep
正在等待標準輸入。
grep -l -e 'foo' --exclude-dir=".svn"*
考慮使用確認,.svn
預設情況下排除類似的資料夾(並具有許多其他功能)。
答案2
您可能感興趣確認。它執行遞歸搜尋(以及其他類似 grep 的操作),並排除諸如.svn或者.git預設情況下。
答案3
解決grep --exclude-dir...
方案應該沒問題,但只是為了展示另一種方式,您可以使用find
's執行此操作-prune
:
find -name .svn -prune -o -type f -exec grep -l "$pattern" {} +
如果你想進一步執行一些事情,find
比普通的更好grep -r
:
find -name .svn -prune -o -type f -exec grep -q "$pattern" {} \; -exec ./process {} \;
答案4
如果您不想 grep 進入諸如.svn
曾經您可以設定$GREP_OPTIONS
變數以排除它,如下所示:
export GREP_OPTIONS="--exclude-dir=\*/.svn/\*"
只需將此行新增至您.bashrc
的遞歸 grep 將不再進入.svn
目錄。當然,它可以隨你的需要而豐富:
export GREP_OPTIONS="--exclude-dir=\*/.svn/\* --exclude-dir=\*/.hg/\* --exclude-dir=\*/.git/\* --exclude=\*~"