5

как найти фразу / слово рекурсивно в файловом дереве в Linux?
Я пытался find . -name ./* | grep my_phrase и я попробовал grep -r "register_long_arrays" *

5 ответов5

9
grep -r "register_long_arrays" *

будет рекурсивно найти все вхождения register_long_arrays в вашем текущем каталоге.

Если вы хотите объединить find с grep для ограничения типов искомых файлов, вы должны использовать его следующим образом (этот пример ограничит поиск файлами, заканчивающимися на .txt):

find . -name '*.txt' -exec grep "register_long_arrays" {} \;

{} Заменяется каждым файлом, который find находки, и вам не нужно беспокоиться о экранировании таких проблемных символов, как пробелы. Обратите внимание на обратную косую черту перед точкой с запятой. Это гарантирует, что точка с запятой экранируется и передается предложению exec (grep), а не завершает команду find.

Если вы все еще не можете найти то, что вам нужно, это может быть проблема с регистром ( укажите флаг -i для grep, чтобы игнорировать регистр) или, возможно, содержимое, которое вы хотите, находится в скрытом файле (начиная с .), Что * не будет match, в этом случае укажите оба аргумента * и .* качестве аргументов для grep.

3
find . -type f -exec grep my_phrase {} \;

будет работать для поиска всех обычных файлов, но он вызывает grep один раз для каждого файла. Это неэффективно и значительно замедлит поиск на медленных компьютерах и / или в больших иерархиях каталогов. По этой причине лучше использовать xargs:

find . -type f | xargs grep my_phrase

или, если у вас есть файлы, имена которых содержат пробелы,

find . -type f -print0 | xargs -0 grep my_phrase

Еще проще - просто использовать опцию -r для grep:

grep -r my_phrase .

Обратите внимание на использование. вместо * в качестве аргумента имени файла. Это позволяет избежать проблемы расширения *, не включая скрытые файлы.

0
find . -exec grep my_phrase {} \;

find генерирует список всех файлов в или ниже текущего каталога. exec выполнит команду grep my_phrase для каждого найденного файла. \; это просто волшебство, чтобы заставить его работать. Подробности того, как это работает, обычно можно увидеть с помощью man find .

Вы также можете посмотреть опцию -H в grep если хотите знать не только, был ли он найден, но и где.

0

пытаться:

find . -name ./\* | xargs grep my_phrase

xargs будет вызывать grep with для каждого файла, который find находки.

0

Вы также можете попробовать извед. Это быстро. Если вы работаете с деревьями кода, это отличный инструмент.

Поиск foobar в содержимом файла рекурсивно из текущего каталога:

ack foobar

Поиск файлов, имена которых соответствуют регулярному выражению:

ack -g "foo(bar)?"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .