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

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

find . | xargs grep "texthere" *
Комментарии к вопросу (8)
Решение
grep -r "texthere" .

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

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

Комментарии (11)

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

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

Вы также можете указать файлы для исключения с помощью --exclude.

Ag

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

Комментарии (7)

Также:

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

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

Комментарии (10)

Я теперь всегда используйте (даже на Windows с Гоу -- GNU на Windows):

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

Которая включает следующие варианты:

--include=PATTERN

рекурсия в каталогах только поиск файлов, которые соответствуют "паттерн".

-n, --line-number

помечать каждую строку вывода с номером строки в его входном файле.

(Примечание: phuclv добавляет в комментариях, что снижает производительность много так, так что вы, возможно, захотите пропустить эту опцию)

-R, -r, --recursive

читать все файлы в каталоге рекурсивно; это эквивалентно вариант-д рекурсия`.

-H, --with-filename

печать имени файла на каждый матч.

-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;
...
Комментарии (7)

В POSIX систем, вы Дон'т параметр команда grep и свой команда grep -РН "по мелочи" и . выиграл'т бежать, но если вы используете найти команды:

найти . -тип F -exec для греп -Н "по мелочи" и {} \; -принт`

Согласовано Солярис и НР-УБ.

Комментарии (2)

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

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

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

grep "texthere" **/*.txt

который Грэпс только определенные файлы с выбранным узором. Она работает для всех поддерживаемых оболочек, таких как Баш +4 или ЗШ.

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

Смотрите также: https://stackoverflow.com/q/16956810/55075

в Git команда grep

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

git grep "pattern"

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

ripgrep

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

rg "pattern" .

Это'ы построенные на вершине Руст'с регулярное выражение двигателя, который использует метод конечных автоматов, Симд и агрессивных буквальном оптимизацию для поиска очень быстро. Проверьте подробный анализ здесь.

Комментарии (2)

Чтобы найти имя файлы с путь рекурсивно, содержащий конкретное строку, используйте следующую команду для ОС UNIX`:

find . | xargs grep "searched-string"

для Линукс:

grep -r "searched-string" .

найти файл на сервере Unix`

find . -type f -name file_name

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

find . -name file_name
Комментарии (0)

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

grep -r -l "foo" .
Комментарии (0)

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

grep -r "thingToBeFound" directory

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

grep -R "thing to be found" directory

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

-H: outputs the filename with the line

-n: outputs the line number in the file

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

grep -rnH "Darth Vader" .

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

/home/adam/Desktop/TomAndJerry 

и вы'вновь на данный момент в каталоге

/home/adam/Desktop/WorldDominationPlot

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

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

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

Источник:

работает на "грэп-помощь"и

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

Комментарии (0)

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

Здесь'ы короткий тест. Я очистить кэш перед каждым тестом (ср. 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
Комментарии (0)

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

grep -R "texthere" *
Комментарии (0)

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

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

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

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

Где-Н принтами` номер строки.

Комментарии (1)

Это единственное, что работал для моего случая на моей текущей машине (ГИТ баш на Windows 7):

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

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

Редактировать: мой любимый инструмент теперь вместо ripgrep: https://github.com/BurntSushi/ripgrep/releases . Это's действительно быстро и имеет лучшие значения по умолчанию (например, рекурсивный по умолчанию). Же пример, как мой оригинальный ответ, но используя ripgrep: РГ -г и"*.компания CS" и "по образцу содержание"в

Комментарии (0)

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

Вот каталог с 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: самогон установите ripgrep. Это устанавливает серебро-искатель: самогон установите the_silver_searcher.

Комментарии (4)

команда grep -Р "и texthere" в. (обратите внимание на точку в конце)

(кредит^: https://stackoverflow.com/a/1987928/1438029)


Пояснение:

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

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

рекурсивный греп

grep [опции] шаблон [файл...]

[опции]

-Р-р --рекурсивные

читать все файлы в каталоге рекурсивно.

Это эквивалентно -д рекурсия или --каталоги=параметр рекурсии.

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

грэп помочь

$ грэп-помощь

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

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

АСК (http://beyondgrep.com/)

АГ (http://github.com/ggreer/the_silver_searcher)

Комментарии (0)

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

для команды Unix-это:

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

для команды Linux-это:

grep -r "string to be searched" .
Комментарии (0)

В моем ИБМ сервера AIX (версия ОС: AIX 5.2 с), используйте:

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

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

./Инк/xxxx_x.ч

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

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

Комментарии (0)

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

grep --help 

Возвращает все матчи регулярного выражения texthere в текущем каталоге, с соответствующим номером строки:

grep -rn "texthere" .

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

grep -rni "texthere" /

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

  • рекурсивный
  • печатать номер строки с выхода
  • игнорировать регистр
Комментарии (0)

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

grep myText $(find .)

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

grep myText $(find .) | cut -d : -f 1 | sort | uniq
Комментарии (1)

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

грэп -Р texthere .|грэп .тхт

Комментарии (0)