Существует, конечно, много возможностей.
Например, если это - USB-устройство, Вы могли бы контролировать трафик USB между устройством/вычислять в системе с поддержкой драйвера (аналогичный tcpdump для сети). Например, для Windows существует несколько доступных инструментов монитора USB (IIRC usbsnoop, например).
В случае сканера USB Вы могли, например, генерировать трассировку с настройками по умолчанию, затем изменять настройки, генерировать другую трассировку, сравнивать их и выяснять то, что изменилось и так далее.
Аналогичный этому Вы могли проследить материал для SCSI, Firewire и т.д. устройства.
Затем Вы могли попробовать к dis-assemble/debug собственный драйвер (например, с про IDA).
Или Вы могли выполнить Windows в виртуальной машине или эмуляторе (например, qemu) и использовать точки останова и осмотреть аппаратное состояние перед/после того, как вызовами драйвера. Аналогичный этому Вы могли наблюдать к тому, какие регистры или что-то как этот драйвер пишет/читает.
Править: Если у Вас есть утилиты 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
).
На невстроенном Linux, Cygwin или другой системе с GNU grep, на FreeBSD, на NetBSD и OSX:
grep -r --include='*.sh' word .
Не анализируйте вывод ls
. И не используйте замену команды относительно вывода find
, поскольку jw013 объяснил.
Комбинация grep
и find
во многих случаях ack
(betterthangrep.com):
ack [OPTION]... PATTERN [FILE]
Для Вашего примера рассмотреть использование
ack --shell word /
ack
.git
, .hg
, .svn
, ...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
ack
, никогда не знал, что это существовало, очень удобное для dev!
– legends2k
19.01.2013, 22:13