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

<p>как мне рекурсивно <code>grep</code> все каталоги и подкаталоги?</p><pre><code>find . | xargs grep "texthere" * </code></pre>

<pre><code>grep -r "texthere" . </code></pre><p>первый параметр представляет регулярное выражение для поиска, а второй представляет каталог, в котором нужно искать. в этом случае <code>.</code> означает текущий каталог.</p><p>примечание. это работает для gnu grep, и на некоторых платформах, таких как solaris, вы должны специально использовать gnu grep, а не в устаревшей реализации. для solaris это команда <code>ggrep</code>.</p>

<p>если вы знаете расширение или шаблон файла, который вам нужен, другой способ - использовать параметр <code>--include</code>:</p><pre><code>grep -r --include "*.txt" texthere . </code></pre><p>вы также можете упомянуть файлы, которые нужно исключить, с помощью <code>--exclude</code>.</p><h3>ag</h3><p>если вы часто просматриваете код, <a href="https://github.com/ggreer/the\_silver\_searcher">ag (the silver searcher)</a> - это гораздо более быстрая альтернатива grep, она настроена для поиска кода. например, по умолчанию он рекурсивен и автоматически игнорирует файлы и каталоги, перечисленные в <code>.gitignore</code>, поэтому вам не нужно постоянно передавать одни и те же громоздкие параметры исключения для grep или find.</p>

<p>также:</p><pre><code>find ./ -type f -print0 | xargs -0 grep "foo" </code></pre><p>но <code>grep -r</code> - лучший ответ.</p>

<p>теперь я всегда использую (даже в windows с <a href="https://github.com/bmatzelle/gow/wiki">gow - gnu в windows</a> ):</p><pre><code>grep --include="*.xxx" -nrhi "my text to grep" * </code></pre><p>это включает в себя следующие параметры:</p><pre><code>--include=pattern </code></pre><blockquote> <p>рекурсировать в каталогах только для поиска файла, соответствующего <code>pattern</code>.</p> </blockquote><pre><code>-n, --line-number </code></pre><blockquote> <p>префикс каждой строки вывода с номером строки в своем входном файле.</p> </blockquote><p>(примечание: <a href="https://stackoverflow.com/users/995714/phuclv">phuclv</a> добавляет <a href="https://stackoverflow.com/questions/1987926/how-do-i-grep-recursively/14871646?noredirect=1#comment95804259\_14871646">в комментариях</a> что <a href="https://stackoverflow.com/a/12630617/6309"><code>-n</code> сильно снижает производительность</a> , так что вы можете пропустить эту опцию)</p><pre><code>-r, -r, --recursive </code></pre><blockquote> <p>читать все файлы в каждом каталоге, рекурсивно; это эквивалентно опции <code>-d recurse</code>.</p> </blockquote><pre><code>-h, --with-filename </code></pre><blockquote> <p>напечатайте имя файла для каждого соответствия.</p> </blockquote><pre><code>-i </code></pre><blockquote> <p>обрабатывать двоичный файл так, как будто он не содержит совпадающих данных;<br> это эквивалентно опции <code>--binary-files=without-match</code>.</p> </blockquote><p>и я могу добавить '<code>i</code>' (<code>-nrhii</code>), если я хочу получить результаты без учета регистра.</p><p>я могу получить:</p><pre><code>/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; ... </code></pre>

<p>в системах posix вы не найдете параметр <code>-r</code> для <code>grep</code>, и ваш <code>grep -rn "stuff" .</code> не запустится, но если вы используете команду <code>find</code>, она будет:</p><p><code>find . -type f -exec grep -n "stuff" {} \; -print</code></p><p>согласовано с <code>solaris</code> и <code>hp-ux</code>.</p>

<h3> <a href="http://www.linuxjournal.com/content/globstar-new-bash-globbing-option">globbing <code>**</code></a> </h3><p>использование <code>grep -r</code> работает, но может привести к перегрузке, особенно в больших папках.</p><p>для более практического использования, вот синтаксис, который использует <a href="http://www.linuxjournal.com/content/globstar-new-bash-globbing-option">globbing синтаксис</a> (<code>**</code>):</p><pre><code>grep "texthere" **/*.txt </code></pre><p>который greps только определенные файлы с шаблоном выбранного шаблона. это работает для поддерживаемых оболочек, таких как <em> bash +4 </em> или <em> zsh </em>.</p><p>чтобы активировать эту функцию, запустите: <code>shopt -s globstar</code>.</p><p>смотрите также: <a href="https://stackoverflow.com/q/16956810/55075">как мне найти все файлы, содержащие определенный текст в linux?</a> </p><h3> <a href="https://git-scm.com/docs/git-grep"><code>git grep</code></a> </h3><p>для проектов под управлением версией git используйте:</p><pre><code>git grep "pattern" </code></pre><p>что намного быстрее.</p><h3> <a href="https://github.com/burntsushi/ripgrep"><code>ripgrep</code></a> </h3><p>для больших проектов самый быстрый инструмент поиска - <a href="https://github.com/burntsushi/ripgrep"><code>ripgrep</code></a> , который по умолчанию рекурсивно обрабатывает файлы:</p><pre><code>rg "pattern" . </code></pre><p>он построен на основе <a href="https://github.com/rust-lang-nursery/regex">механизм регулярных выражений rust</a> , который использует конечные автоматы, simd и агрессивные буквальные оптимизации, чтобы сделать поиск очень быстрым. проверьте <a href="http://blog.burntsushi.net/ripgrep/">подробный анализ здесь</a> .</p>

<p>чтобы найти имя <code>files</code> с <code>path</code> рекурсивно, содержащим конкретную <code>string</code>, используйте приведенную ниже команду для <code>unix</code>:</p><pre><code>find . | xargs grep "searched-string" </code></pre><p>для <code>linux</code>:</p><pre><code>grep -r "searched-string" . </code></pre><p>найти файл на сервере <code>unix</code></p><pre><code>find . -type f -name file\_name </code></pre><p>найти файл на сервере linux</p><pre><code>find . -name file\_name </code></pre>

<p>просто имена файлов тоже могут быть полезны</p><pre><code>grep -r -l "foo" . </code></pre>

<p>если вы хотите следовать только фактическим каталогам, а не символическим ссылкам,</p><pre><code>grep -r "thingtobefound" directory </code></pre><p>если вы хотите следовать символическим ссылкам, а также фактическим каталогам (будьте осторожны с бесконечной рекурсией),</p><pre><code>grep -r "thing to be found" directory </code></pre><p>поскольку вы пытаетесь выполнить рекурсивный grep, вам также могут быть полезны следующие опции:</p><pre><code>-h: outputs the filename with the line -n: outputs the line number in the file </code></pre><p>поэтому, если вы хотите найти все файлы, содержащие дарта вейдера, в текущем каталоге или любых подкаталогах и захватить имя файла и номер строки, но не хотите, чтобы рекурсия следовала по символическим ссылкам, команда будет</p><pre><code>grep -rnh "darth vader" . </code></pre><p>если вы хотите найти все упоминания о word cat в каталоге</p><pre><code>/home/adam/desktop/tomandjerry </code></pre><p>и вы в настоящее время в каталоге</p><pre><code>/home/adam/desktop/worlddominationplot </code></pre><p>и вы хотите захватить имя файла, но не номер строки любого экземпляра строки "cats", и вы хотите, чтобы рекурсия следовала по символическим ссылкам, если она их находит, вы можете запустить любой из следующих</p><pre><code>grep -rh "cats" ../tomandjerry #relative directory grep -rh "cats" /home/adam/desktop/tomandjerry #absolute directory </code></pre><p>источник:</p><p>работает "grep --help"</p><p>краткое введение в символические ссылки для всех, кто читает этот ответ и смущен моей ссылкой на них: <a href="https://www.nixtutor.com/freebsd/understanding-symbolic-links/">https://www.nixtutor.com/freebsd/understanding-symbolic-links/</a> </p>

<p>ag - мой любимый способ сделать это сейчас <a href="http://github.com/ggreer/the\_silver\_searcher">github.com/ggreer/the\_silver\_searcher</a> . это в основном то же самое, что и ack, но с еще несколькими оптимизациями.</p><p>вот краткий тест. я очищаю кэш перед каждым тестом (cf <a href="https://askubuntu.com/questions/155768/how-do-i-clean-or-disable-the-memory-cache">https://askubuntu.com/questions/155768/how-do-i-clean-or-disable-the-memory-cache</a> )</p><pre><code>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 

это тот, который работал для моего случая на моей текущей машине (git bash на windows 7):find ./ -type f -iname ".cs" -print0 | xargs -0 grep "content pattern" я всегда забываю -print0 и -0 для путей с пробелами.правка: мой предпочтительный инструмент теперь вместо ripgrep: <a href="https://github.com/burntsushi/ripgrep/releases">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 "texthere"  

grep -r "texthere" .  (период уведомления в конце) (^ credit: <a href="https://stackoverflow.com/a/1987928/1438029">https://stackoverflow.com/a/1987928/1438029 )<strong> разъяснение: </strong>grep -r "texthere" / (рекурсивно grep <strong> все </strong> каталоги и подкаталоги)grep -r "texthere" . (рекурсивно grep  эти  каталоги и подкаталоги)grep рекурсивный<blockquote> grep [options] pattern [file...] [опции] -r, -r, --recursive читать все файлы в каждом каталоге, рекурсивно. это эквивалентно опции -d recurse или --directories=recurse.  <a href="http://linuxcommand.org/man_pages/grep1.html">http://linuxcommand.org/man_pages/grep1.html  </blockquote>grep помогите$ grep --help</code></p><pre><code>$ grep --help |grep recursive -r, --recursive like --directories=recurse -r, --dereference-recursive альтернативыack ( <a href="http://beyondgrep.com/">http://beyondgrep.com/ )ag ( <a href="http://github.com/ggreer/the_silver_searcher">http://github.com/ggreer/the_silver_searcher )

на моем сервере ibm aix (версия ос: aix 5.2) используйте:find ./ -type f -print -exec grep -n -i "stringyouwannafind" {} ; это выведет путь/имя файла и относительный номер строки в файле, например:./inc/xxxx_x.h2865:/ описание: stringyouwannafind  /во всяком случае, у меня это работает :)

ниже приведена команда для поиска string рекурсивно в среде unix и linux.для unix команда:find . -name "string to be searched" -exec grep "text" "{}" ; для linux команда:grep -r "string to be searched" . 

я думаю, это то, что вы пытаетесь написатьgrep mytext $(find .) </code></pre><p>и это может быть что-то еще полезное, если вы хотите найти файлы grep hit</p><pre><code>grep mytext $(find .) | cut -d : -f 1 | sort | uniq 

в 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.

для списка доступных флагов:grep --help возвращает все совпадения для текста регулярного выражения  здесь  в текущем каталоге с соответствующим номером строки:grep -rn "texthere" . возвращает все совпадения для  текста здесь , начиная с корневого каталога, с соответствующим номером строки и игнорируя регистр:grep -rni "texthere" / <strong>здесь используются флаги:</strong> -r рекурсивный -n вывести номер строки с выводом -i игнорировать регистр 

обратите внимание, что решения find . -type f | xargs grep whatever будут приводить к ошибкам "список аргументов для длинных", когда слишком много файлов совпадают с поиском.лучшая ставка - grep -r, но если она недоступна, используйте вместо нее find . -type f -exec grep -h whatever {} ;.

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

вот рекурсивная (слегка протестированная с bash и sh) функция, которая перебирает все подпапки данной папки ($ 1) и использует <code>grep</code> для поиска заданной строки ($ 3) в заданных файлах ($ 2):</p><pre><code>$ 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 </code></pre>