Как найти фразу / слово рекурсивно в дереве файлов в 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                                                                                                                  
}

Вы можете указать только регулярное выражение или ограничить поиск дополнительными аргументами:

  • Просто регулярное выражение
  • Начальный каталог и регулярное выражение
  • Начальный каталог, шаблон имени файла и регулярное выражение
  • Если вы не укажете аргументы, вы получите справочное сообщение
Другие вопросы по тегам