Используйте синтаксис grep --exclude / - include, чтобы не просматривать определенные файлы - PullRequest
720 голосов
/ 21 октября 2008

Я ищу строку foo= в текстовых файлах в дереве каталогов. Это на обычной машине Linux, у меня есть оболочка bash:

grep -ircl "foo=" *

В каталогах также много бинарных файлов, которые соответствуют "foo =". Поскольку эти результаты не релевантны и замедляют поиск, я хочу, чтобы grep пропустил поиск этих файлов (в основном изображений JPEG и PNG). Как бы я это сделал?

Я знаю, что есть опции --exclude=PATTERN и --include=PATTERN, но каков формат шаблона? На странице руководства grep написано:

--include=PATTERN     Recurse in directories only searching file matching PATTERN.
--exclude=PATTERN     Recurse in directories skip file matching PATTERN.

Поиск по grep include , grep include exclude , grep exclude и варианты не нашли ничего релевантного

Если есть лучший способ поиска только в определенных файлах, я все для этого; перемещение оскорбительных файлов не вариант. Я не могу искать только определенные каталоги (структура каталогов - большой беспорядок, со всем везде). Кроме того, я ничего не могу установить, поэтому мне приходится иметь дело с обычными инструментами (такими как grep или с предложением find ).

Ответы [ 22 ]

5 голосов
/ 27 августа 2009

Да, я дилетант, но вот как выглядит мой ~ / .bash_profile:

export GREP_OPTIONS="-orl --exclude-dir=.svn --exclude-dir=.cache --color=auto" GREP_COLOR='1;32'

Обратите внимание, что для исключения двух каталогов мне пришлось дважды использовать --exclude-dir.

4 голосов
/ 15 апреля 2018

git grep

Используйте git grep, который оптимизирован для производительности и предназначен для поиска по определенным файлам.

По умолчанию он игнорирует двоичные файлы и учитывает ваш .gitignore. Если вы не работаете со структурой Git, вы все равно можете использовать ее, передав --no-index.

Пример синтаксиса:

git grep --no-index "some_pattern"

Дополнительные примеры см .:

3 голосов
/ 22 августа 2016

Если вы выполняете поиск без рекурсии, вы можете использовать шаблонов glop , чтобы соответствовать именам файлов.

grep "foo" *.{html,txt}

включает в себя HTML и TXT. Он ищет только в текущем каталоге.

Для поиска в подкаталогах:

   grep "foo" */*.{html,txt}

В подкаталогах:

   grep "foo" */*/*.{html,txt}
3 голосов
/ 21 октября 2008

Попробуйте это:

 $ find . -name "*.txt" -type f -print | xargs file | grep "foo=" | cut -d: -f1

Основано здесь: http://www.unix.com/shell-programming-scripting/42573-search-files-excluding-binary-files.html

2 голосов
/ 15 апреля 2018

В каталогах также много бинарных файлов. Я не могу искать только определенные каталоги (структура каталогов - большой беспорядок). Есть ли лучший способ поиска только в определенных файлах?

ripgrep

Это один из самых быстрых инструментов, предназначенных для рекурсивного поиска в текущем каталоге. Это написано в Rust , построенном поверх двигателя регулярного выражения Rust для максимальной эффективности. Проверьте подробный анализ здесь .

Так что вы можете просто запустить:

rg "some_pattern"

Он уважает ваш .gitignore и автоматически пропускает скрытые файлы / каталоги и двоичные файлы.

Вы все еще можете настроить включение или исключение файлов и каталогов, используя -g / --glob. Правила Globbing соответствуют .gitignore globs. Проверьте man rg на помощь.

Дополнительные примеры см .: Как исключить некоторые файлы, не соответствующие определенным расширениям, с помощью grep?

На macOS вы можете установить через brew install ripgrep.

2 голосов
/ 21 октября 2008

найди и xargs твои друзья. Используйте их для фильтрации списка файлов, а не для grep --exclude

Попробуйте что-то вроде

find . -not -name '*.png' -o -type f -print | xargs grep -icl "foo="
2 голосов
/ 10 ноября 2010

Смотри @ вот это.

grep --exclude="*\.svn*" -rn "foo=" * | grep -v Binary | grep -v tags
2 голосов
/ 05 ноября 2008

эти сценарии не решают всех проблем ... Попробуйте лучше:

du -ha | grep -i -o "\./.*" | grep -v "\.svn\|another_file\|another_folder" | xargs grep -i -n "$1"

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

наслаждайся! нашел на моей оболочке linux! XD

1 голос
/ 02 апреля 2012

подходит для tcsh .alias файла:

alias gisrc 'grep -I -r -i --exclude="*\.svn*" --include="*\."{mm,m,h,cc,c} \!* *'

Мне потребовалось время, чтобы понять, что часть {mm, m, h, cc, c} НЕ должна быть в кавычках. ~ Keith

1 голос
/ 06 апреля 2009

Опция --binary-files=without-match для GNU grep позволяет пропустить двоичные файлы. (Эквивалентно переключателю -I, упомянутому в другом месте.)

(Для этого может потребоваться последняя версия grep; как минимум, у 2.5.3.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...