Используйте синтаксис grep --exclude/--include, чтобы не использовать grep через определенные файлы
Я ищу строку foo=
в текстовых файлах в дереве каталогов. Это на общей машине Linux, у меня есть оболочка bash:
grep -ircl "foo=" *
в каталогах также много двоичных файлов, которые соответствуют " foo=". Поскольку эти результаты не актуальны и замедляют поиск, я хочу, чтобы grep пропустил поиск этих файлов (в основном изображений JPEG и PNG). Как мне это сделать?
Я знаю, что есть --exclude=PATTERN
и --include=PATTERN
параметры, но каков формат шаблона? Страница человека греп говорит:--6-->
--include=PATTERN Recurse in directories only searching file matching PATTERN.
--exclude=PATTERN Recurse in directories skip file matching PATTERN.
Поиск grep включают, grep include exclude, grep исключить и варианты не нашли ничего подходящего
если есть лучший способ захвата только в определенных файлах, я все за; перемещение файлов-нарушителей не является вариантом. Я не могу искать только определенные каталоги (структура каталогов-большой беспорядок, со всем повсюду). Кроме того, я ничего не могу установить, поэтому я должен иметь дело с общие инструменты (например,grep или предложил найти).
22 ответов
использовать синтаксис оболочки подстановка:
grep pattern -r --include=\*.{cpp,h} rootdir
синтаксис --exclude
идентичны.
обратите внимание, что звезда экранируется с обратной косой чертой, чтобы предотвратить ее расширение оболочкой (цитируя ее, например --include="*.{cpp,h}"
, будет работать так же хорошо). В противном случае, если у вас есть файлы в текущем рабочем каталоге, соответствующие шаблону, командная строка расширится до grep pattern -r --include=foo.cpp --include=bar.h rootdir
, который будет искать только файлы с именем foo.cpp
и bar.h
, что вполне скорее всего, не то, что ты хотел.
Если вы просто хотите пропустить двоичные файлы, я предлагаю вам посмотреть на -I
(верхний регистр i) вариант. Он игнорирует двоичные файлы. Я регулярно использую следующую команду:
grep -rI --exclude-dir="\.svn" "pattern" *
он выполняет рекурсивный поиск, игнорирует двоичные файлы и не просматривает скрытые папки Subversion для любого шаблона, который я хочу. У меня есть псевдоним "grepsvn" на моей коробке на работе.
пожалуйста, взгляните на ack, который предназначен именно для таких ситуаций. Ваш пример
grep -ircl --exclude=*.{png,jpg} "foo=" *
сделано с ack как
ack -icl "foo="
потому что ack никогда не смотрит в двоичных файлах по умолчанию, и-r включен по умолчанию. И если вам нужны только CPP и H файлы, то просто сделайте
ack -icl --cpp "foo="
grep 2.5.3 ввел параметр --exclude-dir, который будет работать так, как вы хотите.
grep -rI --exclude-dir=\.svn PATTERN .
вы также можете установить переменную среды: GREP_OPTIONS= " --exclude-dir=.svn"
Я нашел это через долгое время, вы можете добавить несколько включает и исключает, как:
grep "z-index" . --include=*.js --exclude=*js/lib/* --exclude=*.min.js
предложено команду:
grep -Ir --exclude="*\.svn*" "pattern" *
концептуально неверно, потому что --exclude работает с базовым именем. Другими словами, он пропустит только то .svn в текущем каталоге.
в grep 2.5.1 вы должны добавить эту строку в ~/.bashrc или ~/.профиль Баш
export GREP_OPTIONS="--exclude=\*.svn\*"
Я считаю, что выход greping grep иногда очень полезен:
grep -rn "foo=" . | grep -v "Binary file"
хотя это на самом деле не останавливает его от поиска двоичных файлов.
на CentOS 6.6 / Grep 2.6.3 я должен использовать его следующим образом:
grep "term" -Hnir --include \*.php --exclude-dir "*excluded_dir*"
обратите внимание на отсутствие знака равенства "=" (иначе --include
, --exclude
, include-dir
и --exclude-dir
игнорируются)
если вы не против использования find
, Я люблю его -prune
характеристика:
в первой строке вы указываете каталог, который хотите найти. .
(текущий каталог) является допустимым путем, например.
на 2-й и 3-й линий, используйте "*.png"
, "*.gif"
, "*.jpg"
и так далее. Используйте как можно больше этих -o -name "..." -prune
конструкции, как у вас шаблоны.
на 4-й строке вам нужен другой -o
(это указывает "или"find
), узоры вы хотите, и вам нужно либо -print
или -print0
в конце его. Если вы просто хотите "все остальное", что остается после обрезки *.gif
, *.png
, etc. изображения, затем использовать
-o -print0
и вы закончили с 4-й строкой.
наконец, на 5-й линии-это трубы xargs
который для каждого из этих результирующих файлов и сохраняет их в переменной FILENAME
. Затем он проходит grep
the -IR
флаги "pattern"
, а потом FILENAME
расширяется xargs
стать этот список имен файлов, найденных find
.
для вашего конкретного вопроса, то заявление может выглядеть примерно так:
я дилетант, конечно, но вот как мой ~/.файл выглядит так:
export GREP_OPTIONS="-orl --exclude-dir=.svn --exclude-dir=.cache --color=auto" GREP_COLOR='1;32'
обратите внимание, что для исключения двух каталогов мне пришлось использовать --exclude-dir дважды.
попробуй это:
$ 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
найти и xargs ваши друзья. Используйте их для фильтрации списка файлов, а не --exclude
попробуйте что-то вроде
find . -not -name '*.png' -o -type f -print | xargs grep -icl "foo="
эти сценарии не выполняют всю проблему...Попробуйте это лучше:
du -ha | grep -i -o "\./.*" | grep -v "\.svn\|another_file\|another_folder" | xargs grep -i -n ""
этот скрипт настолько лучше, потому что он использует "реальные" регулярные выражения, чтобы избежать поиска каталогов. просто отдельные имена папок или файлов с "\|" на grep-v
наслаждайтесь! найдено в моей оболочке linux! XD
Если вы ищете нерекурсивно, вы можете использовать glop patterns чтобы соответствовать имена.
grep "foo" *.{html,txt}
включает html и txt. Он выполняет поиск только в текущем каталоге.
для поиска в подкаталогах:
grep "foo" */*.{html,txt}
В subsubdirectories:
grep "foo" */*/*.{html,txt}
git grep
использовать git grep
который оптимизирован для производительности и направлен на поиск по определенным файлам.
по умолчанию он игнорирует двоичные файлы, и он чтит ваш .gitignore
. Если вы не работаете со структурой Git, вы все равно можете использовать ее, передав --no-index
.
синтаксис:
git grep --no-index "some_pattern"
дополнительные примеры см. В разделе:
на --binary-files=without-match
опция для GNU grep
позволяет пропустить двоичные файлы. (Эквивалент -I
переключатель упоминается в другом месте.)
(для этого может потребоваться последняя версия grep
; 2.5.3 имеет, по крайней мере.)
подходит для tcsh .файл Alias:
alias gisrc 'grep -I -r -i --exclude="*\.svn*" --include="*\."{mm,m,h,cc,c} \!* *'
потребовалось некоторое время,чтобы понять,что часть {mm,m,h, cc, c} не должна быть внутри кавычек. ~Кит
в каталогах также много двоичных файлов. Я не могу искать только определенные каталоги (структура каталогов-большой беспорядок). Есть ли лучший способ grepping только в определенных файлах?
ripgrep
это один из самых быстрых инструментов, предназначенных для рекурсивного поиска в текущем каталоге. Это написано в Руст, построенный поверх двигатель regex ржавчины для максимальной эффективности. Проверять the подробный анализ здесь.
так что вы можете просто запустить:
rg "some_pattern"
он уважает ваш .gitignore
и автоматически пропускать скрытые файлы/каталоги и двоичные файлы.
вы все еще можете настроить включить или исключить файлы и каталоги, используя -g
/--glob
. Глоббинг правила матч .gitignore
Глобс. Проверка man rg
за помощью.
дополнительные примеры см. В разделе: как исключить некоторые файлы, не соответствующие определенным расширениями греп?
на macOS, вы можете установить через brew install ripgrep
.
игнорировать все двоичные результаты grep
grep -Ri "pattern" * | awk '{if( != "Binary") print }'
часть awk отфильтрует все двоичные файлы foo соответствует строкам
попробуйте это:
- создать папку с именем "
--F
" под currdir ..(или связать другую папку, переименованную в"--F
" iedouble-minus-F
. #> grep -i --exclude-dir="\-\-F" "pattern" *