Как искать слово во всем содержимом каталога в Linux

15

нужно искать что-то во всем контенте

Я стараюсь:

find . | xargs grep word

Я получаю ошибку:

xargs: неопределенная цитата

Как этого добиться?

хуг
источник

Ответы:

15

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
Жиль "ТАК - прекрати быть злым"
источник
+1 специально для /dev/null. Это неприятно, когда формат вывода может варьироваться, в зависимости от того, сколько файлов совпадают ... спасибо.
Peter.O
12

Я думаю, вы имеете в виду первый вариант

grep recursive, для поиска содержимого внутри файлов

grep -R "content_to_search" /path/to/directory

ls рекурсивно, для поиска файлов, которые соответствуют

ls -lR | grep "your_search"
Фейда Кила
источник
grep -rin для recursive-case_insensitive-show_line_number
Я хочу иметь возможность искать в содержимом каждого файла.
первый возвращает любое вхождение в любом файле, указывая файл, в котором было обнаружено
2

Если у вас есть инструменты GNU (что вы делаете, если тег Linux точен), то вы можете использовать -print0и -0обойти обычные проблемы цитирования:

find . -type f -print0 | xargs -0 grep word
мю слишком коротка
источник
0

Там также ack , он предназначен для пропуска специальных каталогов, как .svn, .gitи тому подобное. Это ежедневный инструмент для разработчиков.

Это довольно близко к для общих ключей.

Ex. :

ack -r string .

Пакет ack-grepна Debian и Debian любит.

Жиль Квено
источник
0

В текущем каталоге вы можете использовать grep:

 grep -irl root .
Ранджиткумар Т
источник
-1

Я думаю, что вы хотите найти строку в файлах

Пытаться find . -name "*" | xargs grep -l "string"


источник
Сообщение об ошибке от xargs («Unterminated quote») означает, что у OP есть файл в. который имеет цитату в своем названии. Ваша линия будет квакает на этом также. Как заметил Му, вам нужно другое окончание.
thiton