Відповіді:
xargs
очікує введення у форматі, який не створює жодна інша команда, тому його важко ефективно використовувати. Тут відбувається не так, що у вас є файл, ім'я якого повинно бути вказано при введенні xargs
(можливо, містить а '
).
Якщо ваш греп підтримує -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 -R "content_to_search" /path/to/directory
Рекурсивна для пошуку файлів, які відповідають
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
. Неприємно, коли формат виводу може змінюватись, залежно від того, скільки файлів зібрано ... спасибі.