Рекурсивный поиск в папке, но исключение подпапки svn

Рекурсивный поиск в папке, но исключение подпапки svn

Я хочу найти все вхождения 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=\*~"

Связанный контент