Могу ли я выполнить поиск во всех текстовых файлах в дереве (но не в двоичных файлах) для определенной строки

#bash #shell #unix #find #grep

#bash #оболочка #unix #Найти #grep

Вопрос:

Мой лучший вариант на данный момент (для поиска строк в каталоге, содержащем большую программу на C)

 find ~/example_directory -type f ( -name "*.mk" -or -name "*.[sch]" ) -print0 | xargs -0 -e grep "example_string"
  

Который работает довольно хорошо, но он зависит от всех интересных вещей, находящихся в .mk makefiles, .c или .h исходных файлах и .s файлах ассемблера.

Я думал о добавлении таких вещей, как «все файлы с именем Makefile» или «все * .py скрипты python», но оказалось, что было бы намного проще, если бы был какой-то способ указать find только для поиска текстовых файлов.

Если вы просто запускаете grep для всех файлов, это занимает много времени, и вы получаете много неинтересных обращений к объектным файлам.

Ответ №1:

GNU grep поддерживает -I опцию, которая позволяет обрабатывать двоичные файлы (как определено путем просмотра первых нескольких байтов), как если бы они не совпадали, поэтому они по существу пропускаются.

Комментарии:

1. Спасибо, я искал именно это, и меня немного смутили ребята из SU, которые сказали, что все это двоичный файл ?! superuser.com/questions/195880 /…

Ответ №2:

 grep -rI <path> <pattern>
  

Переключатель ‘-r’ вызывает рекурсию grep, а ‘-I’ заставляет его игнорировать двоичные файлы.

Существуют дополнительные переключатели для исключения определенных файлов и каталогов (я часто делаю это, например, для исключения метаданных svn)

Ответ №3:

Вы смотрели на ack?

Из 10 лучших причин использовать ack:

ack игнорирует большую часть дерьма, которое вы не хотите искать

  • двоичные файлы, дампы ядра и т. Д

Ответ №4:

Вы можете использовать grep -I для игнорирования двоичных файлов. Использование GNU Parallel вместо xargs позволит вам разбить работу на несколько процессов, используя некоторый параллелизм для ускорения.

В документации есть пример того, как выполнить параллельный grep: http://www.gnu.org/s/parallel/man.html#example__parallel_grep

 find -type f | parallel -k -j150% -n 1000 -m grep -I "example_string"