Ответы:
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. Это неприятно, когда формат вывода может варьироваться, в зависимости от того, сколько файлов совпадают ... спасибо.