Как искать слово во всем содержимом каталога в 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 любит.



-1

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

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


Сообщение об ошибке от xargs («Unterminated quote») означает, что у OP есть файл в. который имеет цитату в своем названии. Ваша линия будет квакает на этом также. Как заметил Му, вам нужно другое окончание.
thiton
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.