Рекурсивный grep для слов в конкретном типе файла

Существует, конечно, много возможностей.

Например, если это - USB-устройство, Вы могли бы контролировать трафик USB между устройством/вычислять в системе с поддержкой драйвера (аналогичный tcpdump для сети). Например, для Windows существует несколько доступных инструментов монитора USB (IIRC usbsnoop, например).

В случае сканера USB Вы могли, например, генерировать трассировку с настройками по умолчанию, затем изменять настройки, генерировать другую трассировку, сравнивать их и выяснять то, что изменилось и так далее.

Аналогичный этому Вы могли проследить материал для SCSI, Firewire и т.д. устройства.

Затем Вы могли попробовать к dis-assemble/debug собственный драйвер (например, с про IDA).

Или Вы могли выполнить Windows в виртуальной машине или эмуляторе (например, qemu) и использовать точки останова и осмотреть аппаратное состояние перед/после того, как вызовами драйвера. Аналогичный этому Вы могли наблюдать к тому, какие регистры или что-то как этот драйвер пишет/читает.

7
26.04.2012, 21:26
3 ответа

Править: Если у Вас есть утилиты GNU, см. ответ Gilles для метода с помощью GNU grepспособности к рекурсии, который намного более прост, чем find подход. Если Вы только захотите отобразить имена файлов, то Вы все еще захотите добавить -l опция, как я описываю ниже.


Использовать grep -l word только к расшифровке подписи файлов, содержащих соответствие.

Если Вы хотите найти все файлы в файловой системе, заканчивающейся в .sh, запуск в корне /, затем find самый соответствующий инструмент.

Самая портативная и эффективная рекомендация:

find / -type f -name '*.sh' -exec grep -l word {} + 2>/dev/null

Это почти столь читаемо, как это добирается и не твердо проанализировать, если Вы понимаете семантику позади каждого из компонентов.

  • find /: выполненный find запуск в корне файловой системы, /
  • -type f: только соответствуйте регулярным файлам
  • -name '*.sh':... и только файлы соответствия, имена которых заканчиваются в .sh
  • -exec ... {} +: команда выполнения, указанная в ... на подобранных файлах в группах, где {} заменяется именами файлов в группе. Идея состоит в том, чтобы работать на команде как можно больше файлов сразу в рамках системы (ARG_MAX). Эффективность {} + форма прибывает из уменьшения количества раз ... команду нужно назвать путем максимизации количества файлов, переданных каждому вызову ....
  • grep -l word {}: где {} то же {} повторенный сверху и заменяется именами файлов. Как ранее объяснено, grep -l печатает названия файлов, содержащих достойный word.
  • 2>/dev/null: скройте сообщения об ошибках (технически, перенаправьте стандартную погрешность к черной дыре, которая является /dev/null). Это по эстетическим и практическим причинам, начиная с выполнения find на / вероятно, приведет к стопкам "разрешения, отклоненного" сообщения, о которых Вы не можете заботиться о файлах, которые у Вас нет разрешения читать и каталоги, которые у Вас нет разрешения пересечь.

Существуют некоторые проблемы с предложениями, которые Вы получили и отправили в своем вопросе. Оба

grep word `find / -name \*.sh 2>/dev/null

и

find / -name "*.sh" 2>/dev/null | xargs grep word

сбой на файлах с пробелом на их имя. Лучше стараться не помещать имена файлов в замену команды в целом. Первый имеет дополнительную проблему потенциального столкновения с пределом ARG_MAX. Второй - близко к тому, что я предлагаю, но нет никакого серьезного основания использовать xargs здесь, не говоря уже о том, что безопасное и корректное использование xargs требует мобильности принесения в жертву для некоторых опций только для GNU (find -print0 | xargs -0).

8
27.01.2020, 20:14
  • 1
    Спасибо за понятное и полное объяснение! –  paulrehkugler 26.04.2012, 23:57
  • 2
    Спасибо за понятное и полное объяснение! –  paulrehkugler 26.04.2012, 23:57

На невстроенном Linux, Cygwin или другой системе с GNU grep, на FreeBSD, на NetBSD и OSX:

grep -r --include='*.sh' word .

Не анализируйте вывод ls. И не используйте замену команды относительно вывода find, поскольку jw013 объяснил.

8
27.01.2020, 20:14
  • 1
    Doh, я чувствую себя глупым для упущения о рекурсивном grep. –  jw013 27.04.2012, 06:04
  • 2
    Doh, я чувствую себя глупым для упущения о рекурсивном grep. –  jw013 27.04.2012, 06:04

Комбинация grep и find во многих случаях ack (betterthangrep.com):

ack [OPTION]... PATTERN [FILE]

Для Вашего примера рассмотреть использование

ack --shell word /

Примечания

ack

  • поиски (по умолчанию) рекурсивно, но
  • игнорирует (по умолчанию) каталоги от общих систем управления версиями, например. .git, .hg, .svn, ...
  • может легко сузить Ваши результаты при помощи фильтров для типов общего файла (см. ниже для отличных шаблонов имени файла),
  • имеет a grep- как синтаксис и те же/подобные аргументы как -i для "игнорируют регистр" и т.д.
  • может быть назван ack-grep в Вашей системе (на Debian основывал дистрибутивы, если я помню правильно),

Шаблоны имени файла

Опция --shell коротко для --type=shell и включает несколько типов файлов: в настоящее время .sh .bash .csh .tcsh .ksh .zsh согласно

ack --help-types

Если Вы хотите только .sh файлы, необходимо определить (добавляет) собственный тип sh и используйте этот фильтр (--sh) как это:

ack word --type-add=sh=.sh --sh /

Это звучит немного сложным, но позволяет рекурсивный поиск .sh файлы ниже /. Для локального поиска (не указывая начальный каталог, например. \) это было бы легче:

ack word *.sh
2
27.01.2020, 20:14
  • 1
    Спасибо за показ меня ack, никогда не знал, что это существовало, очень удобное для dev! –  legends2k 19.01.2013, 22:13

Теги

Похожие вопросы