Как я могу grep рекурсивно?

Как мне рекурсивно grep все каталоги и подкаталоги?

find . | xargs grep "texthere" *

29 ответов

Решение
grep -r "texthere" .

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

Примечание: это работает для GNU grep, и на некоторых платформах, таких как Solaris, вы должны специально использовать GNU grep, а не устаревшую реализацию. Для Соляриса это ggrep команда.

Если вы знаете расширение или шаблон файла, который вы хотели бы, другой метод заключается в использовании --include опция:

grep -r --include "*.txt" texthere .

Вы также можете упомянуть файлы, которые нужно исключить с --exclude,

Ag

Если вы часто просматриваете код, Ag (The Silver Searcher) - гораздо более быстрая альтернатива grep, настроенная для поиска кода. Например, по умолчанию он рекурсивен и автоматически игнорирует файлы и каталоги, перечисленные в .gitignore, так что вам не нужно постоянно передавать одни и те же громоздкие опции исключения для grep или find.

Я сейчас всегда использую (даже на Windows с GoW - Gnu на Windows):

grep --include="*.xxx" -nRHI "my Text to grep" *

Это включает в себя следующие параметры:

--include=PATTERN

Рекурсировать в каталогах только поиск подходящего файла PATTERN,

-n, --line-number

Префикс каждой строки вывода с номером строки в своем входном файле.

-R, -r, --recursive

Читать все файлы в каждом каталоге, рекурсивно; это эквивалентно -d recurse вариант.

-H, --with-filename

Напечатайте имя файла для каждого соответствия.

-I     

Обрабатывать двоичный файл так, как будто он не содержит совпадающих данных;
это эквивалентно --binary-files=without-match вариант.

И я могу добавитьi'(-nRHIi), если я хочу результаты без учета регистра.

Я могу получить:

/home/vonc/gitpoc/passenger/gitlist/github #grep --include="*.php" -nRHI "hidden" *
src/GitList/Application.php:43:            'git.hidden'      => $config->get('git', 'hidden') ? $config->get('git', 'hidden') : array(),
src/GitList/Provider/GitServiceProvider.php:21:            $options['hidden'] = $app['git.hidden'];
tests/InterfaceTest.php:32:        $options['hidden'] = array(self::$tmpdir . '/hiddenrepo');
vendor/klaussilveira/gitter/lib/Gitter/Client.php:20:    protected $hidden;
vendor/klaussilveira/gitter/lib/Gitter/Client.php:170:     * Get hidden repository list
vendor/klaussilveira/gitter/lib/Gitter/Client.php:176:        return $this->hidden;
...

Также:

find ./ -type f -print0 | xargs -0 grep "foo"

но grep -r лучший ответ.

Или установите ack, если вы хотите гораздо более быстрый способ и делаете это много.

подстановка **

С помощью grep -r работает, но может перебить, особенно в больших папках.

Для более практического использования, вот синтаксис, который использует синтаксис globbing (**):

grep "texthere" **/*.txt

который greps только определенные файлы с шаблоном выбранного шаблона. Это работает для поддерживаемых оболочек, таких как Bash +4 или Zsh.

Чтобы активировать эту функцию, запустите: shopt -s globstar,

См. Также: Как найти все файлы, содержащие определенный текст в Linux?

git grep

Для проектов под управлением версией Git используйте:

git grep "pattern"

что намного быстрее.

ripgrep

Для более крупных проектов самый быстрый инструмент ripgrep какие greps файлы рекурсивно по умолчанию:

rg "pattern" .

Он построен на основе движка регулярных выражений Rust, который использует конечные автоматы, SIMD и агрессивные буквальные оптимизации, чтобы сделать поиск очень быстрым. Проверьте подробный анализ здесь.

В системах POSIX вы не найдете -r параметр для grep и ваш grep -rn "stuff" . не будет работать, но если вы используете find Команда это будет:

find . -type f -exec grep -n "stuff" {} \; -print

Согласовано Solaris а также HP-UX,

another syntax to grep a string in all files on a Linux system recursively

      grep -irn "string" /

displays massive result so u might need to filter the output by piping

Если вы хотите следовать только фактическим каталогам, а не символическим ссылкам,

grep -r "thingToBeFound" directory

Если вы хотите следовать символическим ссылкам, а также фактическим каталогам (будьте осторожны с бесконечной рекурсией),

grep -R "thing to be found" directory

Поскольку вы пытаетесь выполнить рекурсивный grep, вам также могут пригодиться следующие параметры:

-H: outputs the filename with the line

-n: outputs the line number in the file

Поэтому, если вы хотите найти все файлы, содержащие Дарта Вейдера, в текущем каталоге или любых подкаталогах и захватить имя файла и номер строки, но не хотите, чтобы рекурсия следовала по символическим ссылкам, команда будет

grep -rnH "Darth Vader" .

Если вы хотите найти все упоминания слова cat в каталоге

/home/adam/Desktop/TomAndJerry 

и вы в настоящее время в каталоге

/home/adam/Desktop/WorldDominationPlot

и вы хотите захватить имя файла, но не номер строки любого экземпляра строки "cats", и вы хотите, чтобы рекурсия следовала по символическим ссылкам, если она их находит, вы можете запустить любой из следующих

grep -RH "cats" ../TomAndJerry                   #relative directory

grep -RH "cats" /home/adam/Desktop/TomAndJerry   #absolute directory

Источник:

работает "grep --help"

Краткое введение в символические ссылки, для всех, кто читает этот ответ и смущен моей ссылкой на них: https://www.nixtutor.com/freebsd/understanding-symbolic-links/

Чтобы найти имя files с path рекурсивно содержащий конкретный string используйте команду ниже UNIX:

find . | xargs grep "searched-string"

за Linux:

grep -r "searched-string" .

найти файл на UNIX сервер

find . -type f -name file_name

найти файл на сервере LINUX

find . -name file_name

Могут быть полезны только имена файлов

grep -r -l "foo" .

ag - мой любимый способ сделать это сейчас http://github.com/ggreer/the_silver_searcher. Это в основном то же самое, что и ack, но с еще несколькими оптимизациями.

Вот краткий тест. Я очищаю кэш перед каждым тестом (см. https://askubuntu.com/questions/155768/how-do-i-clean-or-disable-the-memory-cache)

ryan@3G08$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time grep -r "hey ya" .

real    0m9.458s
user    0m0.368s
sys 0m3.788s
ryan@3G08:$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time ack-grep "hey ya" .

real    0m6.296s
user    0m0.716s
sys 0m1.056s
ryan@3G08$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time ag "hey ya" .

real    0m5.641s
user    0m0.356s
sys 0m3.444s
ryan@3G08$ time ag "hey ya" . #test without first clearing cache

real    0m0.154s
user    0m0.224s
sys 0m0.172s

Это должно работать:

grep -R "texthere" *

Это тот, который работал для моего случая на моей нынешней машине (git bash на windows 7):

find ./ -type f -iname "*.cs" -print0 | xargs -0 grep "content pattern"

Я всегда забываю -print0 и -0 для путей с пробелами.

РЕДАКТИРОВАТЬ: мой предпочтительный инструмент теперь вместо ripgrep: https://github.com/BurntSushi/ripgrep/releases. Он действительно быстрый и имеет лучшие значения по умолчанию (например, рекурсивный по умолчанию). Тот же пример, что и мой оригинальный ответ, но с использованием ripgrep: rg -g "*.cs" "content pattern"

Если вы ищете конкретный контент во всех файлах из структуры каталогов, вы можете использовать find так как более понятно что ты делаешь

find -type f -exec grep -l "texthere" {} +

Обратите внимание, что -l (нижний регистр L) показывает имя файла, который содержит текст. Удалите его, если вместо этого вы хотите напечатать сам матч. Или использовать -H чтобы получить файл вместе со спичкой. Все вместе, другие альтернативы:

find -type f -exec grep -Hn "texthere" {} +

куда -n печатает номер строки

Бросаю сюда свои два цента. Как уже упоминалось, grep -r работает не на всех платформах. Это может показаться глупым, но я всегда использую git.

git grep "texthere"

Даже если каталог не поставлен, я просто создаю его и использую git grep.

grep -r "texthere" . (период уведомления в конце)

(^ credit: /questions/6813573/kak-ya-mogu-grep-rekursivno/6813592#6813592)


Разъяснение:

grep -r "texthere" / (рекурсивно grep все каталоги и подкаталоги)

grep -r "texthere" . (рекурсивно grep эти каталоги и подкаталоги)

grep рекурсивный

grep [options] PATTERN [FILE...]

[опции]

-R, -r, --recursive

Читать все файлы в каждом каталоге, рекурсивно.

Это эквивалентно -d recurse или же --directories=recurse вариант.

http://linuxcommand.org/man_pages/grep1.html

grep помогите

$ grep --help

$ grep --help |grep recursive
  -r, --recursive           like --directories=recurse
  -R, --dereference-recursive

альтернативы

ack ( http://beyondgrep.com/)

ag ( http://github.com/ggreer/the_silver_searcher)

Ниже приведены команды для поиска String рекурсивно на Unix а также Linux среда.

за UNIX команда:

find . -name "string to be searched" -exec grep "text" "{}" \;

за Linux команда:

grep -r "string to be searched" .

В 2018 году вы хотите использовать ripgrep или же the-silver-searcher потому что они намного быстрее, чем альтернативы.

Вот каталог с 336 подкаталогами первого уровня:

% find . -maxdepth 1 -type d | wc -l
     336

% time rg -w aggs -g '*.py'
...
rg -w aggs -g '*.py'  1.24s user 2.23s system 283% cpu 1.222 total

% time ag -w aggs -G '.*py$'
...
ag -w aggs -G '.*py$'  2.71s user 1.55s system 116% cpu 3.651 total

% time find ./ -type f -name '*.py' | xargs grep -w aggs
...
find ./ -type f -name '*.py'  1.34s user 5.68s system 32% cpu 21.329 total
xargs grep -w aggs  6.65s user 0.49s system 32% cpu 22.164 total

На OSX это устанавливает ripgrep: brew install ripgrep, Это устанавливает silver-searcher: brew install the_silver_searcher,

На моем сервере IBM AIX (версия ОС: AIX 5.2) используйте:

find ./ -type f -print -exec grep -n -i "stringYouWannaFind" {} \; 

это выведет путь / имя файла и относительный номер строки в файле, например:

./inc/xxxx_x.h

2865: / ** Описание: stringYouWannaFind */

во всяком случае, у меня это работает:)

Для списка доступных флагов:

grep --help 

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

grep -rn "texthere" .

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

grep -rni "texthere" /

флаги, используемые здесь:

  • -r рекурсивный
  • -n печатать номер строки с выводом
  • -i игнорировать регистр

Обратите внимание, что find . -type f | xargs grep whatever Решения такого рода будут приводить к ошибкам "Список аргументов для длинных", когда слишком много файлов соответствует запросу.

Лучшая ставка grep -r но если это не доступно, используйте find . -type f -exec grep -H whatever {} \; вместо.

Вот рекурсивная (слегка протестированная с bash и sh) функция, которая перебирает все подпапки данной папки ($1) и использует grep ищет заданную строку ($3) в заданных файлах ($2):

$ cat script.sh
#!/bin/sh

cd "$1"

loop () {
    for i in *
    do
        if [ -d "$i" ]
        then
            # echo entering "$i"
            cd "$i"
            loop "$1" "$2"
        fi
    done

    if [ -f "$1" ]
    then
        grep -l "$2" "$PWD/$1"
    fi

    cd ..
}

loop "$2" "$3"

Запуск и пример вывода:

$ sh script start_folder filename search_string
/home/james/start_folder/dir2/filename

Я думаю, это то, что вы пытаетесь написать

grep myText $(find .)

и это может быть что-то еще полезное, если вы хотите найти файлы grep hit

grep myText $(find .) | cut -d : -f 1 | sort | uniq

Для файлов.gz рекурсивно сканировать все файлы и каталоги. Измените тип файла или поместите *

find . -name \*.gz -print0 | xargs -0 zgrep "STRING"

В Solaris (и, вероятно, в других старых Unix-системах)

ggrep -r "$ваштекст" $каталог

Просто для удовольствия, быстрый и грязный поиск файлов *.txt, если ответ @christangrant слишком велик для ввода:-)

grep -r texthere .|grep .txt

Получите первые совпадающие файлы из команды grep и получите все файлы, не содержащие какого-либо слова, но входные файлы для второго grep берутся из файлов результатов первой команды grep.

      grep -l -r --include "*.js" "FIRSTWORD" * | xargs grep "SECONDwORD"
grep -l -r --include "*.js" "FIRSTWORD" * | xargs grep -L "SECONDwORD"

дк0фд654-37дф-4420-8ба5-6046а9дбе406

      grep -l -r --include "*.js" "SEARCHWORD" * | awk -F'/' '{print $NF}' | xargs -I{} sh -c 'echo {}; grep -l -r --include "*.html" -w --include=*.js -e {} *;  echo '''

5319778a-cec2-444d-bcc4-53d33821fedb

The syntax is:
cd /path/to/dir
grep -r <"serch_word name"> .
Другие вопросы по тегам