Как мне рекурсивно grep
все каталоги и подкаталоги?
find . | xargs grep "texthere" *
grep -rin xlsx *.pl
у меня не работает на Redhat Linux. Я получаю ошибку "нет совпадения".
Как мне рекурсивно grep
все каталоги и подкаталоги?
find . | xargs grep "texthere" *
grep -rin xlsx *.pl
у меня не работает на Redhat Linux. Я получаю ошибку "нет совпадения".
Ответы:
grep -r "texthere" .
Первый параметр представляет регулярное выражение для поиска, а второй представляет каталог, в котором нужно искать. В данном случае .
означает текущий каталог.
Примечание: это работает для GNU grep, и на некоторых платформах, таких как Solaris, вы должны специально использовать GNU grep, а не устаревшую реализацию. Для Соляриса это ggrep
команда.
AIX 5.3
например.
Если вы знаете расширение или шаблон файла, который вам нужен, другой способ - использовать --include
параметр:
grep -r --include "*.txt" texthere .
Вы также можете упомянуть файлы, которые нужно исключить --exclude
.
Если вы часто просматриваете код, Ag (The Silver Searcher) - гораздо более быстрая альтернатива grep, настроенная для поиска кода. Например, по умолчанию он рекурсивный и автоматически игнорирует файлы и каталоги, перечисленные в нем .gitignore
, поэтому вам не нужно постоянно передавать одни и те же громоздкие параметры исключения для grep или find.
=
отлично работает в Ubuntu. PS: это должно быть пробел, но анализатор уценки SO не удался.
grep
, а не за Аг, просто чтобы вы знали :)
--include "*.txt" --include "*.TXT"
Также:
find ./ -type f -print0 | xargs -0 grep "foo"
но grep -r
это лучший ответ.
find . -type f -exec grep "foo" '{}' \;
хорошо работает там, где поддерживается.
find ./ -type f -print0 | xargs -0 grep "foo"
Теперь я всегда использую (даже в Windows с GoW - Gnu в Windows ):
grep --include="*.xxx" -nRHI "my Text to grep" *
Это включает в себя следующие параметры:
--include=PATTERN
Рекурсировать в каталогах только поиск подходящего файла
PATTERN
.
-n, --line-number
Префикс каждой строки вывода с номером строки в своем входном файле.
(Примечание: phuclv добавляет в комментарии, что значительно -n
снижает производительность , поэтому вы можете пропустить эту опцию)
-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;
...
-R
опции) к папкам.
*
или .
шаблон глобуса (интерпретируется оболочкой): unix.stackexchange.com/a/64695/7490 . ' .
' также выберет точечные файлы или точечные папки (как .git/
)
grep -rnI
но потом я узнал, что -n
это сильно снижает производительность, поэтому я просто использую его, когда это действительно необходимо, и обычно я использую-rI
В системах POSIX вы не найдете -r
параметр для, grep
и ваш grep -rn "stuff" .
не будет работать, но если вы используете find
команду, она будет:
find . -type f -exec grep -n "stuff" {} \; -print
Договорились Solaris
и HP-UX
.
-exec
опции - символ {}
- это ссылка на имя файла, которое в данный момент найдено find
инструментом (то есть что-то сделать с найденным нами именем файла), также -exec
опция должна заканчиваться ;
символом (для обозначения окончания команд exec), но поскольку это все при запуске в оболочке этот символ должен быть экранирован ... и, наконец, -print
опция позволяет find
инструменту распечатывать найденные имена файлов на экране.
**
Использование grep -r
работает, но это может перебить, особенно в больших папках.
Для более практического использования, вот синтаксис, который использует синтаксис globbing ( **
):
grep "texthere" **/*.txt
который greps только определенные файлы с шаблоном выбранного шаблона. Это работает для поддерживаемых оболочек, таких как Bash +4 или Zsh .
Чтобы активировать эту функцию, выполните команду: shopt -s globstar
.
Смотрите также: Как мне найти все файлы, содержащие определенный текст в Linux?
git grep
Для проектов под управлением версией Git используйте:
git grep "pattern"
что намного быстрее
ripgrep
Для более крупных проектов самый быстрый инструмент поиска - ripgrep
это рекурсивный поиск файлов по умолчанию:
rg "pattern" .
Он построен на основе движка регулярных выражений Rust, который использует конечные автоматы, SIMD и агрессивные буквальные оптимизации, чтобы сделать поиск очень быстрым. Проверьте подробный анализ здесь .
Чтобы найти имя 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 "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/
ag - мой любимый способ сделать это сейчас 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" *
Если вы ищете определенный контент во всех файлах из структуры каталогов, вы можете использовать, find
так как это более понятно, что вы делаете:
find -type f -exec grep -l "texthere" {} +
Обратите внимание, что -l
(нижний регистр L) показывает имя файла, который содержит текст. Удалите его, если вместо этого вы хотите напечатать соответствие. Или используйте, -H
чтобы получить файл вместе с совпадением. Все вместе, другие альтернативы:
find -type f -exec grep -Hn "texthere" {} +
Где -n
печатает номер строки.
find
решение, которое позволяет избежать ненужного использования xargs
и использования +
вместо \;
с -exec
, тем самым избегая тонны ненужных запусков процессов. :-)
Это тот, который работал для моего случая на моей текущей машине (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"
grep -r "texthere" .
(период уведомления в конце)
(^ credit: https://stackoverflow.com/a/1987928/1438029 )
Разъяснение:
grep -r "texthere" /
(рекурсивно grep все каталоги и подкаталоги)
grep -r "texthere" .
(рекурсивно grep эти каталоги и подкаталоги)
grep [options] PATTERN [FILE...]
[опции]
-R, -r, --recursive
Читать все файлы в каждом каталоге, рекурсивно.
Это эквивалентно опции
-d recurse
или--directories=recurse
.
$ grep --help
$ grep --help |grep recursive
-r, --recursive like --directories=recurse
-R, --dereference-recursive
ack
( http://beyondgrep.com/ )
В 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
.
rg
имеет значительное преимущество перед объединением рекурсивной команды grep с нуля. Использование rg
: rg foo
. Использование инструментов Unix: find . | xargs grep foo
. И если в любом из ваших файлов есть цитата, вам нужно использовать find . -print0 | xargs -0 grep foo
. Собираетесь ли вы помнить это, если вы используете это несколько раз в год?
find . -type f -exec grep 'regex' {} +
что действительно легко запомнить, если вы используете эти инструменты с какой-либо регулярностью. Но, возможно, вам все равно придется запускать ctags
или использовать etags
исходное дерево, если вам нужно часто что-то искать.
На моем сервере IBM AIX (версия ОС: AIX 5.2) используйте:
find ./ -type f -print -exec grep -n -i "stringYouWannaFind" {} \;
это выведет путь / имя файла и относительный номер строки в файле, например:
./inc/xxxx_x.h
2865: / ** Описание: stringYouWannaFind * /
во всяком случае, у меня это работает :)
Ниже приведена команда для String
рекурсивного поиска Unix
и Linux
окружения.
для UNIX
команды есть:
find . -name "string to be searched" -exec grep "text" "{}" \;
для Linux
команды есть:
grep -r "string to be searched" .
Для списка доступных флагов:
grep --help
Возвращает все совпадения для текста регулярного выражения здесь в текущем каталоге с соответствующим номером строки:
grep -rn "texthere" .
Возвращает все совпадения для текста здесь , начиная с корневого каталога, с соответствующим номером строки и игнорируя регистр:
grep -rni "texthere" /
флаги, используемые здесь:
-r
рекурсивный -n
печатать номер строки с выводом -i
игнорировать регистрЯ думаю, это то, что вы пытаетесь написать
grep myText $(find .)
и это может быть что-то еще полезное, если вы хотите найти файлы grep hit
grep myText $(find .) | cut -d : -f 1 | sort | uniq
Обратите внимание, что find . -type f | xargs grep whatever
в некоторых случаях решения приводят к ошибкам «Список аргументов для длинных», когда слишком много файлов соответствует запросу.
Лучше всего, grep -r
но если это не доступно, используйте find . -type f -exec grep -H whatever {} \;
вместо этого.
xargs
В частности, это обходной путь для проблемы «Список аргументов слишком длинный».
find . -type f | xargs -L 100 grep whatever
xargs
стандартизирован, чтобы иметь такое поведение из коробки. « xargs
Утилита должна ограничивать длину командной строки таким образом, чтобы при вызове командной строки комбинированные списки аргументов и среды ... не превышали {ARG_MAX} -2048 байтов».
Вот рекурсивная (слегка протестированная с 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