Я ищу строку 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 или предлагаемый поиск ).
--exclude-dir=.svn
, так что grep не входит в них вообщеgrep -r --exclude-dir=var "pattern" .
Ответы:
Используйте синтаксис оболочки:
Синтаксис для
--exclude
идентичен.Обратите внимание, что звезду экранируют с помощью обратной косой черты, чтобы предотвратить ее расширение оболочкой (цитирование, например
--include="*.{cpp,h}"
, будет работать так же хорошо). В противном случае, если у вас есть какие-либо файлы в текущем рабочем каталоге, соответствующие шаблону, командная строка будет расширена до чего-то вродеgrep pattern -r --include=foo.cpp --include=bar.h rootdir
, который будет искать только файлы с именамиfoo.cpp
иbar.h
, что, скорее всего, не то, что вы хотели.источник
grep pattern -r --include="*.{cpp,h}" rootdir
grep pattern -r --include=foo.cpp --include=bar.h rootdir
, которая будет искать только файлы по имениfoo.cpp
илиbar.h
. Если у вас нет файлов, которые соответствуют глобу в текущем каталоге, то оболочка передает глоб в grep, который правильно его интерпретирует.--exclude-dir
опция. Однако применяются те же правила. Совпадает только имя файла каталога, а не путь.--include
кажется, не работает после--exclude
. Я полагаю, что не имеет смысла даже пытаться, за исключением того, что у меня естьalias
grep с длинным списком--exclude
и--exclude-dir
, который я использую для поиска кода, игнорирования библиотек и подкачки файлов и прочего. Я бы надеялся , чтоgrep -r --exclude='*.foo' --include='*.bar'
будет работать, так что я мог бы ограничить мой ,alias
чтобы--include='*.bar'
только, но это , кажется, игнорируют--include
и включают в себя все , что это не .foo файл. Менять порядок--include
и--exclude
работает, но увы, это не поможет с моимalias
.PATTERN
. Полчаса я не могу найти описания того, что они там ждутЕсли вы просто хотите пропустить двоичные файлы, я предлагаю вам взглянуть на
-I
(верхний регистр). Он игнорирует двоичные файлы. Я регулярно использую следующую команду:Он ищет рекурсивно, игнорирует двоичные файлы и не ищет в скрытых папках Subversion какой-либо шаблон, который мне нужен. У меня есть псевдоним "grepsvn" на моей коробке на работе.
источник
--exclude-dir
не доступен везде у моего RH box при работе с GNU grep 2.5.1 его нет.--exclude-dir
нет в наличии? Во всех моих попытках, похоже,--exclude
не отвечает всем требованиям .--exclude-dir="\.git"
. :-)Пожалуйста, обратите внимание на ack , который предназначен именно для этих ситуаций. Ваш пример
делается с Ack как
потому что ack никогда не просматривает двоичные файлы по умолчанию, а -r включен по умолчанию. И если вы хотите только файлы CPP и H, то просто сделайте
источник
apt-get
в Ubuntu :)awk
grep 2.5.3 ввел параметр --exclude-dir, который будет работать так, как вы хотите.
Вы также можете установить переменную окружения: GREP_OPTIONS = "- exclude-dir = .svn"
Я второй голос Энди за кв, хотя, это лучший.
источник
Я обнаружил, что после долгого времени вы можете добавить несколько включений и исключений, таких как:
источник
Предлагаемая команда:
концептуально неверно, потому что --exclude работает с базовым именем. Другими словами, он пропустит только .svn в текущем каталоге.
источник
В grep 2.5.1 вы должны добавить эту строку в профиль ~ / .bashrc или ~ / .bash
источник
Иногда я считаю, что вывод grep очень полезен:
Тем не менее, это на самом деле не мешает искать двоичные файлы.
источник
grep -I
чтобы пропустить двоичные файлы.Если вы не против использования
find
, мне нравится его-prune
функция:В первой строке вы указываете каталог, который хотите найти.
.
(текущий каталог) является допустимым путем, например.На 2 - й и 3 - й линии, использование
"*.png"
,"*.gif"
,"*.jpg"
и так далее. Используйте как можно больше-o -name "..." -prune
конструкций, сколько у вас есть шаблонов.На 4-й строке вам нужен другой
-o
(он указывает «или» наfind
) шаблоны, которые вы НУЖНЫ, и вам нужно либо в конце,-print
либо-print0
в конце. Если вы просто хотите «все остальное» , что остается после того, как подрезать*.gif
,*.png
и т.д. изображения, а затем использовать ,-o -print0
и вы сделали с 4 - й линии.Наконец, на 5-й линии идет труба
xargs
который берется каждый из этих результирующих файлов и сохраняется их в переменнойFILENAME
. Затем он проходитgrep
на-IR
флаги, тем"pattern"
, а затемFILENAME
расширяется ,xargs
чтобы стать , что список имен файлов найденfind
.По вашему конкретному вопросу утверждение может выглядеть примерно так:
источник
-false
сразу после каждого,-prune
так что если вы забыли использовать,-print0
или какая-тоexec
команда фактически не напечатает файлы, которые вы хотели исключить:-name "*.png" -prune -false -o name "*.gif -prune -false
...На CentOS 6.6 / Grep 2.6.3 я должен использовать это так:
Обратите внимание на отсутствие знаков равенства «=» ( в противном случае
--include
,--exclude
,include-dir
и--exclude-dir
игнорируется)источник
git grep
Использование,
git grep
которое оптимизировано для производительности и направлено на поиск определенных файлов.По умолчанию он игнорирует двоичные файлы и уважает ваши
.gitignore
. Если вы не работаете со структурой Git, вы все равно можете использовать ее, передавая--no-index
.Пример синтаксиса:
Дополнительные примеры см .:
источник
Конечно, я дилетант, но вот как выглядит мой ~ / .bash_profile:
Обратите внимание, что для исключения двух каталогов мне пришлось дважды использовать --exclude-dir.
источник
Попробуй это:
Основан здесь: http://www.unix.com/shell-programming-scripting/42573-search-files-exclusion-binary-files.html
источник
Если вы ищете не рекурсивно, вы можете использовать шаблоны glop для соответствия именам файлов.
включает в себя HTML и TXT. Он ищет только в текущем каталоге.
Для поиска в подкаталогах:
В подкаталогах:
источник
ripgrep
Это один из самых быстрых инструментов, предназначенных для рекурсивного поиска в текущем каталоге. Он написан на Rust и построен на основе движка Rust для обеспечения максимальной эффективности. Проверьте подробный анализ здесь .
Так что вы можете просто запустить:
Он уважает вас
.gitignore
и автоматически пропускает скрытые файлы / каталоги и двоичные файлы.Вы все еще можете настроить включение или исключение файлов и каталогов, используя
-g
/--glob
. Правила.gitignore
Globbing соответствуют шарам. Проверьтеman rg
на помощь.Дополнительные примеры см .: Как исключить некоторые файлы, не соответствующие определенным расширениям, с помощью grep?
На macOS вы можете установить через
brew install ripgrep
.источник
найди и xargs твои друзья. Используйте их для фильтрации списка файлов, а не grep --exclude
Попробуйте что-то вроде
Преимущество привыкания к этому заключается в том, что его можно использовать в других случаях, например, для подсчета строк во всех файлах, отличных от png:
Чтобы удалить все не-PNG файлы:
и т.п.
Как указано в комментариях, если некоторые файлы могут иметь пробелы в именах, используйте
-print0
иxargs -0
вместо.источник
эти сценарии не решают всех проблем ... Попробуйте это лучше:
этот скрипт лучше, потому что он использует "настоящие" регулярные выражения, чтобы избежать поиска каталогов. просто отдельные имена папок или файлов с помощью "\ |" на grep -v
наслаждайся этим! нашел на моей оболочке linux! XD
источник
Смотри @ этот.
источник
--binary-files=without-match
Вариант GNUgrep
получает его пропустить двоичные файлы. (Эквивалентно-I
переключателю, упомянутому в другом месте.)(Для этого может потребоваться последняя версия
grep
; как минимум, у 2.5.3.)источник
подходит для tcsh .alias файла:
Мне понадобилось время, чтобы понять, что часть {mm, m, h, cc, c} НЕ должна быть в кавычках. ~ Keith
источник
Чтобы игнорировать все двоичные результаты от grep
Часть awk отфильтрует все строки двоичного файла foo match
источник
Попробуй это:
--F
» под currdir .. (или связать другую папку там переименованную «--F
» то естьdouble-minus-F
.#> grep -i --exclude-dir="\-\-F" "pattern" *
источник