Jak rekurencyjnie grepować?
Jak rekurencyjnie grep
wszystkie katalogi i podkatalogi?
find . | xargs grep "texthere" *
24 answers
grep -r "texthere" .
Pierwszy parametr reprezentuje szukane wyrażenie regularne, podczas gdy drugi reprezentuje katalog, który powinien być przeszukiwany. W tym przypadku .
oznacza bieżący katalog.
Uwaga: działa to dla GNU grep, a na niektórych platformach, takich jak Solaris, musisz używać GNU grep w przeciwieństwie do starszych implementacji. Dla Solarisa jest to polecenie ggrep
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-06 17:18:08
Jeśli znasz rozszerzenie lub wzór pliku, który chcesz, inną metodą jest użycie opcji --include
:
grep -r --include "*.txt" texthere .
Możesz również wspomnieć o plikach do wykluczenia za pomocą --exclude
.
Ag
Jeśli często przeszukiwasz kod, Ag (Silver Searcher) jest znacznie szybszą alternatywą dla grepa, który jest dostosowany do wyszukiwania kodu. Na przykład, domyślnie jest rekurencyjny i automatycznie ignoruje pliki i katalogi wymienione w .gitignore
, więc nie musisz przekazywać te same uciążliwe opcje wykluczają grep lub find.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-19 09:56:59
Także:
find ./ -type f -print0 | xargs -0 grep "foo"
Ale to lepsza odpowiedź.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-10 10:41:37
Teraz zawsze używam (nawet na Windows z Gow -- Gnu na Windows):
grep --include="*.xxx" -nRHI "my Text to grep" *
Który obejmuje następujące opcje:
--include=PATTERN
Rekurencja w katalogach wyszukuje tylko pliki pasujące do
PATTERN
.
-n, --line-number
Przedrostek każdego wiersza wyjścia z numerem wiersza w jego pliku wejściowym.
-R, -r, --recursive
Odczytuje rekurencyjnie wszystkie pliki pod każdym katalogiem; jest to równoważne opcji
-d recurse
.
-H, --with-filename
Wyświetla nazwę pliku dla każdego dopasowania.
-I
Przetwarza plik binarny tak, jakby nie zawierał pasujących danych;
jest to równoważne opcji--binary-files=without-match
.
I mogę dodać 'i
' (-nRHIi
), Jeśli chcę wyników niewrażliwych na wielkość liter.
Mogę dostać:
/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;
...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-25 14:34:15
Lub zainstalować ack, jeśli chcesz znacznie szybszy sposób i robisz to dużo.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-01 05:47:41
W systemach POSIX nie znajdziesz parametru -r
dla grep
i Twoje grep -rn "stuff" .
nie uruchomi się, ale jeśli użyjesz polecenia find
to:
find . -type f -exec grep -n "stuff" {} \; -print
Uzgodnione przez Solaris
i HP-UX
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-08 15:03:40
Aby znaleźć nazwę files
z path
zawierającą rekurencyjnie konkretną string
użyj poniższego polecenia
dla UNIX
:
find . | xargs grep "searched-string"
Dla Linux
:
grep -r "searched-string" .
Znajdź plik na UNIX
serwerze
find . -type f -name file_name
Znajdź plik na serwerze LINUX
find . -name file_name
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-31 12:47:39
Ag jest moim ulubionym sposobem na to teraz github.com/ggreer/the_silver_searcher . To w zasadzie to samo co ack, ale z kilkoma innymi optymalizacjami.
Oto krótki benchmark. Czyszczę pamięć podręczną przed każdym testem (cf 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-13 12:22:45
Jeśli chcesz śledzić tylko rzeczywiste katalogi, a nie dowiązania symboliczne,
grep -r "thingToBeFound" directory
Jeśli chcesz podążać zarówno za dowiązaniami symbolicznymi, jak i rzeczywistymi katalogami (uważaj na nieskończoną rekurencję),
grep -R "thing to be found" directory
Ponieważ próbujesz rekurencyjnie grepować, następujące opcje mogą być również przydatne dla ciebie:
-H: outputs the filename with the line
-n: outputs the line number in the file
Więc jeśli chcesz znaleźć wszystkie pliki zawierające Darth Vader w bieżącym katalogu lub podkatalogach i przechwycić nazwę pliku i numer linii, ale nie chcesz rekurencja do podążania za dowiązaniami symbolicznymi, polecenie to
grep -rnH "Darth Vader" .
Jeśli chcesz znaleźć wszystkie wzmianki o słowie Kot w katalogu
/home/adam/Desktop/TomAndJerry
I jesteś aktualnie w katalogu
/home/adam/Desktop/WorldDominationPlot
I chcesz przechwycić nazwę pliku, ale nie numer linii dowolnej instancji łańcucha "cats", i chcesz, aby rekurencja podążała za dowiązaniami symbolicznymi, jeśli je znajdzie, możesz uruchomić jedną z następujących
grep -RH "cats" ../TomAndJerry #relative directory
grep -RH "cats" /home/adam/Desktop/TomAndJerry #absolute directory
Źródło:
Uruchamianie "grep --help"
A krótkie wprowadzenie do dowiązań symbolicznych, dla każdego, kto czyta tę odpowiedź i jest zdezorientowany moim odniesieniem do nich: https://www.nixtutor.com/freebsd/understanding-symbolic-links/
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-03 20:08:36
Tylko nazwy plików też mogą być przydatne
grep -r -l "foo" .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-29 08:46:44
Globbing **
Używanie grep -r
działa, ale może przesadzić, szczególnie w dużych folderach.
Dla bardziej praktycznego zastosowania, oto składnia, która używa składni globbingu (**
):
grep "texthere" **/*.txt
Które grepuje tylko określone pliki z zaznaczonym wzorcem. Działa dla wspieranych powłok, takich jak Bash + 4 lub zsh .
Aby aktywować tę funkcję, Uruchom: shopt -s globstar
.
Zobacz także: Jak znaleźć wszystkie pliki zawierające konkretny tekst na Linuksie?
git grep
Dla projektów pod kontrolą wersji Git, użyj:
git grep "pattern"
Który jest znacznie szybszy.
ripgrep
W przypadku większych projektów, najszybsze narzędzie grepping jest ripgrep
które domyślnie pliki greps rekurencyjnie:
rg "pattern" .
Jest zbudowany na bazie silnika regex Rusta , który wykorzystuje skończone automaty, SIMD i agresywne dosłowne optymalizacje, aby wyszukiwanie było bardzo szybkie. Sprawdź szczegółowa analiza tutaj .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-11 10:12:51
To powinno zadziałać:
grep -R "texthere" *
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-07 00:18:33
Jeśli szukasz określonej zawartości we wszystkich plikach ze struktury katalogów, możesz użyć find
, ponieważ jest bardziej jasne, co robisz:
find -type f -exec grep -l "texthere" {} +
Zauważ, że -l
(downcase of L) pokazuje nazwę pliku zawierającego tekst. Usuń go, jeśli zamiast tego chcesz wydrukować sam mecz. Lub użyj -H
, Aby pobrać plik razem z dopasowaniem. Wszystkie razem inne alternatywy to:
find -type f -exec grep -Hn "texthere" {} +
Gdzie -n
wypisuje numer linii.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-30 16:19:08
To jest ten, który pracował dla mojego przypadku na moim obecnym komputerze (Git bash na windows 7):
find ./ -type f -iname "*.cs" -print0 | xargs -0 grep "content pattern"
Zawsze zapominam-print0 i -0 dla ścieżek ze spacjami.
EDIT: moim preferowanym narzędziem jest teraz ripgrep: https://github.com/BurntSushi/ripgrep/releases . Jest naprawdę szybki i ma lepsze wartości domyślne(jak domyślnie rekurencyjne). Ten sam przykład co moja oryginalna odpowiedź, ale używając ripgrep: rg -g "*.cs" "content pattern"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-15 12:36:32
W moim serwerze IBM AIX (wersja OS: AIX 5.2), użyj:
find ./ -type f -print -exec grep -n -i "stringYouWannaFind" {} \;
To wyświetli ścieżkę / nazwę pliku i względny numer linii w pliku jak:
./ inc / xxxx_x. h
2865: /** opis: stringYouWannaFind * /
W każdym razie u mnie działa :)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-09 09:37:27
grep -r "texthere" .
(okres wypowiedzenia na koniec)
(^kredyt: https://stackoverflow.com/a/1987928/1438029 )
Wyjaśnienie:
grep -r "texthere" /
(rekurencyjnie grep wszystkie katalogi i podkatalogi)
grep -r "texthere" .
(rekurencyjnie grep te katalogi i podkatalogi)
Grep recursive
grep [options] PATTERN [FILE...]
[opcje]
-R, -r, --recursive
Czytaj wszystkie pliki pod każdy katalog, rekurencyjnie.
Jest to równoważne opcji
-d recurse
lub--directories=recurse
.
Grep help
$ grep --help
$ grep --help |grep recursive
-r, --recursive like --directories=recurse
-R, --dereference-recursive
Alternatywy
ack
(http://beyondgrep.com/)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:56
Poniżej znajduje się polecenie wyszukiwania String
rekurencyjnie w środowisku Unix
i Linux
.
Dla UNIX
polecenie to:
find . -name "string to be searched" -exec grep "text" "{}" \;
Dla Linux
polecenie to:
grep -r "string to be searched" .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-08 07:32:12
Myślę, że to właśnie próbujesz napisać
grep myText $(find .)
I może to być coś innego pomocne, jeśli chcesz znaleźć pliki grep hit
grep myText $(find .) | cut -d : -f 1 | sort | uniq
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-03 20:27:28
W 2018 roku chcesz użyć ripgrep
lub the-silver-searcher
, ponieważ są one znacznie szybsze niż alternatywy.
Oto katalog z 336 podkatalogami pierwszego poziomu:
% 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
Na OSX to instaluje ripgrep
: brew install ripgrep
. To instaluje silver-searcher
: brew install the_silver_searcher
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-09 17:30:16
Zauważ, że find . -type f | xargs grep whatever
w różnych rozwiązaniach pojawią się błędy "lista argumentów do długiej", gdy znajdzie się zbyt wiele plików pasujących do find.
Najlepszym rozwiązaniem jest grep -r
, ale jeśli to nie jest dostępne, użyj find . -type f -exec grep -H whatever {} \;
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-21 18:12:47
Dla zabawy, szybkie i brudne wyszukiwanie *.pliki txt, jeśli odpowiedź @ christangrant jest za duża, aby wpisać : -)
grep -r texthere .|grep .txt
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-12 19:14:18
Dla listy dostępnych FLAG:
grep --help
Zwraca wszystkie dopasowania dla wyrażenia regularnego texthere w bieżącym katalogu, z odpowiednim numerem linii:
grep -rn "texthere" .
Zwraca wszystkie dopasowania dla texthere , zaczynając od katalogu głównego, z odpowiednim numerem linii i ignorując wielkość liter:
grep -rni "texthere" /
Flagi użyte tutaj:
-
-r
rekurencyjne -
-n
Drukuj numer linii z wyjściem -
-i
ignoruj case
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-30 22:50:39
Oto rekurencyjna (testowana lekko z bash i sh) funkcja, która przemierza wszystkie podfoldery podanego folderu ($1) i za pomocą grep
wyszukuje podany łańcuch znaków ($3) w podanych plikach ($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"
Uruchomienie i Przykładowe wyjście:
$ sh script start_folder filename search_string
/home/james/start_folder/dir2/filename
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-09 15:21:42
The syntax is:
cd /path/to/dir
grep -r <"serch_word name"> .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-18 08:28:53