Jak rekurencyjnie grepować?

Jak rekurencyjnie grep wszystkie katalogi i podkatalogi?

find . | xargs grep "texthere" *
 1388
Author: Sergey Brunov, 2010-01-01

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.

 2088
Author: Vinko Vrsalovic,
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.

 580
Author: christangrant,
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ź.
 109
Author: Kurt,
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;
...
 86
Author: VonC,
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.

 53
Author: Andrew McGregor,
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.

 19
Author: rook,
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
 10
Author: Girdhar Singh Rathore,
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
 8
Author: dranxo,
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/

 8
Author: SarcasticSully,
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" .
 8
Author: chim,
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 .

 8
Author: kenorb,
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" *
 5
Author: sumit kumar,
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.

 5
Author: fedorqui,
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"

 5
Author: arkod,
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 :)

 3
Author: user3606336,
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.

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

Grep help

$ grep --help

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

Alternatywy

ack (http://beyondgrep.com/)

ag (http://github.com/ggreer/the_silver_searcher )

 3
Author: Geoffrey Hale,
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" .
 3
Author: Girdhar Singh Rathore,
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
 2
Author: Victor Faria,
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.

 2
Author: hughdbrown,
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 {} \;.

 1
Author: m.thome,
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

 1
Author: PJ Brunet,
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
 1
Author: JSON C11,
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
 0
Author: James Brown,
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"> .
 -2
Author: Poo,
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