Ответы:
xargs
ожидает ввода в формате, который не генерирует никакая другая команда, поэтому его сложно эффективно использовать. Что здесь не так, так это то, что у вас есть файл, имя которого должно быть заключено в кавычки xargs
(вероятно, содержащее a '
).
Если ваш grep поддерживает опцию -r
или -R
для рекурсивного поиска, используйте его.
grep -r word .
В противном случае используйте -exec
основной из find
. Это обычный способ достижения того же эффекта, что xargs
и без ограничений на имена файлов. Разумно недавние версии find
позволяют группировать несколько файлов за один вызов вспомогательной команды. Переход /dev/null
к grep
гарантирует, что он будет показывать имя файла перед каждым совпадением, даже если оно вызывается в одном файле.
find . -type f -exec grep word /dev/null {} +
Более старые версии find
(в старых системах или OpenBSD, или урезанные утилиты, такие как BusyBox) могут вызывать вспомогательную команду только для одного файла за раз.
find . -type f -exec grep word /dev/null {} \;
Некоторые версии find
и xargs
имеют расширения, которые позволяют им правильно взаимодействовать, используя нулевые символы для разделения имен файлов, поэтому не нужно заключать в кавычки. В настоящее время только OpenBSD имеет эту функцию без -exec … {} +
.
find . -type f -print0 | xargs -0 grep word /dev/null
Я думаю, вы имеете в виду первый вариант
grep recursive, для поиска содержимого внутри файлов
grep -R "content_to_search" /path/to/directory
ls рекурсивно, для поиска файлов, которые соответствуют
ls -lR | grep "your_search"
Если у вас есть инструменты GNU (что вы делаете, если тег Linux точен), то вы можете использовать -print0
и -0
обойти обычные проблемы цитирования:
find . -type f -print0 | xargs -0 grep word
В текущем каталоге вы можете использовать grep:
grep -irl root .
Я думаю, что вы хотите найти строку в файлах
Пытаться find . -name "*" | xargs grep -l "string"
/dev/null
. Это неприятно, когда формат вывода может варьироваться, в зависимости от того, сколько файлов совпадают ... спасибо.