Как найти фразу / слово рекурсивно в дереве файлов в Linux
Как найти фразу / слово рекурсивно в файловом дереве в 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, чтобы игнорировать регистр) или, возможно, нужный вам контент находится в скрытом файле (начиная с .
), который *
не будет соответствовать, в этом случае поставьте оба *
а также .*
в качестве аргументов для 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 . -name ./\* | xargs grep my_phrase
xargs
вызовет grep с каждым из файлов, которые find
находит.
Вы также можете попробовать ack. Это быстро. Если вы работаете с деревьями кода, это отличный инструмент.
Поиск foobar в содержимом файла рекурсивно из текущего каталога:
ack foobar
Поиск файлов, имена которых соответствуют регулярному выражению:
ack -g "foo(bar)?"
find . -exec grep my_phrase {} \;
find
генерирует список всех файлов в или ниже текущего каталога. exec
выполнит команду grep my_phrase
для каждого найденного файла. \;
это просто волшебство, чтобы заставить его работать. Подробности того, как это работает, обычно можно увидеть с man find
,
Вы также можете посмотреть на -H
вариант grep
если вы хотите знать не только, был ли он найден, но и где.
Я определяю функцию в моем .bashrc
файл, который обеспечивает функциональность большинства других ответов:
findgrep() {
if [[ $# == 1 ]]; then
find . -type f -exec grep -H "$1" '{}' \;
elif [[ $# == 2 ]]; then
find $1 -type f -exec grep -H "$2" '{}' \;
elif [[ $# == 3 ]]; then
find $1 -type f -name "$2" -exec grep -H "$3" '{}' \;
else
echo 'Usage:'
echo 'findgrep searchString'
echo 'findgrep startDir searchString'
echo 'findgrep startDir "fileNamePattern" searchString'
fi
}
Вы можете указать только регулярное выражение или ограничить поиск дополнительными аргументами:
- Просто регулярное выражение
- Начальный каталог и регулярное выражение
- Начальный каталог, шаблон имени файла и регулярное выражение
- Если вы не укажете аргументы, вы получите справочное сообщение