Автоматически игнорировать файлы в grep

есть ли способ использовать grep для игнорирования некоторых файлов при поиске чего-то, что эквивалентно svnignore или gitignore? Я обычно использую что-то подобное при поиске исходного кода.

grep -r something * | grep -v ignore_file1 | grep -v ignore_file2

даже если бы я мог настроить псевдоним grep, чтобы игнорировать эти файлы, было бы хорошо.

6 ответов


--exclude опция на grep также будет работать:

grep  perl * --exclude=try* --exclude=tk*

Это ищет perl в файлах в текущем каталоге, исключая файлы, начинающиеся с try или tk.


вы также можете взглянуть на ack который, среди многих других функций, по умолчанию не выполняет поиск каталогов VCS .svn and .мерзавец.


find . -path ./ignore -prune -o -exec grep -r something {} \;

что это делает, это найти все файлы в вашем текущем каталоге, исключая каталог (или файл) с именем "игнорировать", а затем выполняет команду grep-r что-то на каждом файле, найденном в не игнорируемых файлах.


использовать расширения оболочки

shopt -s extglob
for file in !(file1_ignore|file2_ignore) 
do
  grep ..... "$file"
done

Я думаю, что grep не имеет фильтрации файлов. Чтобы выполнить то, что вы пытаетесь сделать, вы можете объединить команды find, xargs и grep. Моя память не очень хорошая, поэтому пример может не сработать:

find -name "foo" | xargs grep "pattern"

Find является гибким, вы можете использовать подстановочные знаки, игнорировать регистр или использовать регулярные выражения. Вы можете прочитать страницы руководства для полного описания.

после чтения следующего сообщения, по-видимому, grep имеет фильтрацию файлов.


вот минималистичная версия .гитюдного. Требуется стандартный utils: awk, sed (потому что мой awk настолько хромает), egrep:

cat > ~/bin/grepignore  #or anywhere you like in your $PATH
egrep -v "`awk '1' ORS=\| .grepignore | sed -e 's/|$//g' ; echo`"
^D
chmod 755 ~/bin/grepignore
cat >> ./.grepignore  #above set to look in cwd
ignorefile_1
...
^D
grep -r something * | grepignore

grepignore строит простое предложение чере:

egrep -v ignorefile_one|ignorefile_two

не невероятно эффективно, но хорошо для ручного использования