Автоматически игнорировать файлы в 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
не невероятно эффективно, но хорошо для ручного использования