Могу ли я найти все текстовые файлы в дереве (но не в двоичных файлах) по определенной строке - PullRequest
6 голосов
/ 18 октября 2011

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

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

, который работает довольно хорошо, но опирается на все интересные вещи, присутствующие в make-файлах .mk, исходные файлы .c или .h и файлы ассемблера .s.

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

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

Ответы [ 4 ]

11 голосов
/ 18 октября 2011

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

6 голосов
/ 18 октября 2011
grep -rI <path> <pattern>

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

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

2 голосов
/ 18 октября 2011

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

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

find -type f | parallel -k -j150% -n 1000 -m grep -I "example_string"
2 голосов
/ 18 октября 2011

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

Из 10 основных причин использования ack:

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

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