Как рекурсивно grep
все каталоги и подкаталоги?
find . | xargs grep "texthere" *
grep -r "texthere" .
Первый параметр представляет собой регулярное выражение для поиска, а второй - каталог, в котором будет производиться поиск. В данном случае .
означает текущий каталог.
Примечание: Это работает для GNU grep, а на некоторых платформах, таких как Solaris, вы должны специально использовать GNU grep в отличие от унаследованной реализации. Для Solaris это команда ggrep
.
Если вы знаете расширение или шаблон нужного вам файла, можно воспользоваться опцией --include
:
grep -r --include "*.txt" texthere .
Вы также можете указать файлы для исключения с помощью --exclude
.
Если вы часто ищете в коде, Ag (The Silver Searcher) - это гораздо более быстрая альтернатива grep, которая приспособлена для поиска кода. Например, по умолчанию он рекурсивен и автоматически игнорирует файлы и каталоги, перечисленные в .gitignore
, так что вам не придется передавать громоздкие опции исключения в grep или find.
Также:
find ./ -type f -print0 | xargs -0 grep "foo"
но grep -r
- лучший ответ.
Я теперь всегда используйте (даже на 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;
...
В POSIX систем, вы Дон'т -р
параметр команда grep
и свой команда grep -РН "по мелочи" и .
выиграл'т бежать, но если вы используете найти
команды:
найти . -тип F -exec для греп -Н "по мелочи" и {} \; -принт`
Согласовано Солярис
и НР-УБ
.
**
С помощью команды grep -Р` работает, но это может перебор, особенно в больших папках.
Для более практического использования, вот синтаксис, который использует подстановка синтаксис (**
):
grep "texthere" **/*.txt
который Грэпс только определенные файлы с выбранным узором. Она работает для всех поддерживаемых оболочек, таких как Баш +4 или ЗШ.
Чтобы активировать эту функцию, выполните: shopt -с globstar
.
Смотрите также: https://stackoverflow.com/q/16956810/55075
в Git команда grep
Для проектов под управления версиями Git, используйте:
git grep "pattern"
что намного быстрее.
ripgrep
Для более крупных проектов, средства быстрое применение grep к это ripgrep
, который Грэпс файлы рекурсивно по умолчанию:
rg "pattern" .
Это'ы построенные на вершине Руст'с регулярное выражение двигателя, который использует метод конечных автоматов, Симд и агрессивных буквальном оптимизацию для поиска очень быстро. Проверьте подробный анализ здесь.
Чтобы найти имя файлы
с путь
рекурсивно, содержащий конкретное строку, используйте следующую команду
для ОС UNIX`:
find . | xargs grep "searched-string"
для Линукс
:
grep -r "searched-string" .
найти файл на сервере Unix`
find . -type f -name file_name
найти файл на сервере Linux
find . -name file_name
просто имена файлов могут быть слишком полезно
grep -r -l "foo" .
Если вы только хотите следовать актуальным каталогам, а не символические ссылки,
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/
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
Это должно работать:
grep -R "texthere" *
Если вы ищете конкретное содержание в все файлы из структуры каталогов, вы можете использовать найти
поскольку это более понятно, чем вы занимаетесь:
find -type f -exec grep -l "texthere" {} +
Обратите внимание, что -Л
(downcase л) показывает имя файла, содержащего текст. Удалить его, если вы хотите напечатать себе матч. Или использовать -ч
, чтобы получить файл вместе с матчем. Все вместе, другие варианты:
find -type f -exec grep -Hn "texthere" {} +
Где-Н принтами` номер строки.
Это единственное, что работал для моего случая на моей текущей машине (ГИТ баш на 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" и "по образцу содержание"
в
В 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
.
команда grep -Р "и texthere"
в. (обратите внимание на точку в конце)
(кредит^: https://stackoverflow.com/a/1987928/1438029)
Пояснение:
команда grep -Р "и texthere" и /
(рекурсивный греп все каталоги и подкаталоги)
команда grep -Р "и texthere"
в. (рекурсивный греп эти каталоги и подкаталоги)
grep [опции] шаблон [файл...]
[опции]
-Р-р --рекурсивные
читать все файлы в каталоге рекурсивно.
Это эквивалентно
-д рекурсия
или--каталоги=параметр рекурсии
.
$ грэп-помощь
$ grep --help |grep recursive
-r, --recursive like --directories=recurse
-R, --dereference-recursive
АСК
(http://beyondgrep.com/)
Ниже приведены команды для поиска в строку рекурсивно в Unix " и " Linux-окружения
.
для команды Unix-это:
find . -name "string to be searched" -exec grep "text" "{}" \;
для команды Linux-это:
grep -r "string to be searched" .
В моем ИБМ сервера AIX (версия ОС: AIX 5.2 с), используйте:
find ./ -type f -print -exec grep -n -i "stringYouWannaFind" {} \;
это выведет путь/имя файла и относительный номер строки в файл, как:
./Инк/xxxx_x.ч
2865: /* описание : stringYouWannaFind /
в любом случае,это работает для меня : )
Список доступных флагов:
grep --help
Возвращает все матчи регулярного выражения texthere в текущем каталоге, с соответствующим номером строки:
grep -rn "texthere" .
Возвращает все матчи за texthere, начиная с корневого каталога, с соответствующим номером строки и игнорирование регистра:
grep -rni "texthere" /
флаги, используемые здесь:
-Р
рекурсивный -Н
печатать номер строки с выхода -я
игнорировать регистрЯ думаю, это то, что вы'вновь пытается писать
grep myText $(find .)
и это может быть что-то еще полезна, если вы хотите найти файлы, грэп нажмите
grep myText $(find .) | cut -d : -f 1 | sort | uniq