как найти фразу / слово рекурсивно в файловом дереве в Linux?
Я пытался find . -name ./* | grep my_phrase
и я попробовал grep -r "register_long_arrays" *
5 ответов
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.
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 .
Обратите внимание на использование. вместо * в качестве аргумента имени файла. Это позволяет избежать проблемы расширения *, не включая скрытые файлы.
find . -exec grep my_phrase {} \;
find
генерирует список всех файлов в или ниже текущего каталога. exec
выполнит команду grep my_phrase
для каждого найденного файла. \;
это просто волшебство, чтобы заставить его работать. Подробности того, как это работает, обычно можно увидеть с помощью man find
.
Вы также можете посмотреть опцию -H
в grep
если хотите знать не только, был ли он найден, но и где.
пытаться:
find . -name ./\* | xargs grep my_phrase
xargs
будет вызывать grep with для каждого файла, который find
находки.
Вы также можете попробовать извед. Это быстро. Если вы работаете с деревьями кода, это отличный инструмент.
Поиск foobar в содержимом файла рекурсивно из текущего каталога:
ack foobar
Поиск файлов, имена которых соответствуют регулярному выражению:
ack -g "foo(bar)?"