#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"