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



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



grep -ircl "foo=" *


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



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



--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 или предложил найти).

827   22  

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"

Я буду вторым Энди голосовать ack хотя, это лучшее.

Я нашел это после долгого времени, можно добавить несколько включает и исключает как:

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\*"

Я считаю, что выход grep 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 и т. д. изображения, затем использовать -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 ваши друзья. Используйте их для фильтрации списка файлов, а не grep-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

посмотри на это.

grep --exclude="*\.svn*" -rn "foo=" * | grep -v Binary | grep -v tags

Если вы ищете нерекурсивно вы можете использовать glop patterns чтобы соответствовать имена.

grep "foo" *.{html,txt}

включает html и txt. Он выполняет поиск только в текущем каталоге.

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

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

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

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

git grep

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

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

синтаксис:

git grep --no-index "some_pattern"

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

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

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

подходит для tcsh .псевдоним файла:

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

Мне потребовалось некоторое время,чтобы понять,что часть {mm,m,h, cc, c} не должна быть внутри кавычек. -Кит

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

ripgrep

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

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

rg "some_pattern"

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

вы все еще можете настроить включение или исключение файлов и каталогов с помощью -g/--glob. Правила глоббинга совпадают .gitignore Глобс. Проверьте man rg за помощью.

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

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

игнорировать все двоичные результаты из grep

grep -Ri "pattern" * | awk '{if( != "Binary") print }'

awk часть будет отфильтровывать все двоичные файлы foo соответствует строкам

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

  1. создать папку с именем "--F" под currdir ..(или свяжите другую папку, переименованную в"--F" т. е. double-minus-F.
  2. #> grep -i --exclude-dir="\-\-F" "pattern" *

Comments

    Ничего не найдено.