
Я хочу найти все вхождения 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
и ваши рекурсивные greps больше не будут входить в .svn
каталоги. Конечно, он может быть настолько богатым, насколько вы хотите:
export GREP_OPTIONS="--exclude-dir=\*/.svn/\* --exclude-dir=\*/.hg/\* --exclude-dir=\*/.git/\* --exclude=\*~"