Как найти фразу / слово рекурсивно в дереве файлов в Linux

12296
Itay Moav -Malimovka

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

5
Вы ищете файлы, чье * имя * содержит эту фразу / слово или файлы, чье * содержание * содержит это? Nathan Fellman 14 лет назад 2
@ Натан Феллман Содержание содержит фразу Itay Moav -Malimovka 14 лет назад 0

5 ответов на вопрос

9
Ian Mackinnon
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, чтобы игнорировать регистр) или, возможно, нужный вам контент находится в скрытом файле (начиная с .), который *не будет совпадать, в котором случай поставки как *и в .*качестве аргументов Grep.

Ваша команда `find ... -exec grep` не будет отображать имена файлов, содержащих строку, поскольку grep вызывается с одним именем файла каждый раз. Я предлагаю использовать xargs для вызова grep для эффективности (см. Некоторые другие ответы). Даже при использовании xargs возможно, что grep будет вызываться только с одним именем файла, поэтому используйте старую идиому sk00l `xargs grep register_long_arrays / dev / null`, чтобы обмануть grep, или используйте` grep -H` (GNU-ism). coneslayer 14 лет назад 1
3
garyjohn
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
hotei
find . -exec grep my_phrase {} \; 

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

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

0
Nathan Fellman

пытаться:

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

xargsвызовет grep с каждым findнайденным файлом .

0
sickill

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

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

ack foobar 

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

ack -g "foo(bar)?" 

Похожие вопросы