Править: Если у Вас есть утилиты 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
).
Можно хотеть попробовать другое ядро. Изготовленное на заказ ядро может иметь некоторые проблемы с хронометрированием.