Jak mogę wykluczyć katalogi z grep-r?

Chcę przemierzać wszystkie podkatalogi, z wyjątkiem katalogu "node_modules".

Author: TIMEX, 2011-07-04

12 answers

Rozwiązanie 1 (połączenie find i grep)

Celem tego rozwiązania nie jest zajmowanie się wydajnością grep, ale pokazanie przenośnego rozwiązania : powinno również działać z busybox lub GNU w wersji starszej niż 2.5.

Użycie find, do wyłączania katalogów foo i bar:

find /dir \( -name foo -prune \) -o \( -name bar -prune \) -o -name "*.sh" -print

Następnie połącz find oraz nierekurencyjnego wykorzystania grep, jako rozwiązanie przenośne:

find /dir \( -name node_modules -prune \) -o -name "*.sh" -exec grep --color -Hn "your text to find" {} 2>/dev/null \;

Rozwiązanie 2 (rekurencyjne wykorzystanie grep):

Znasz już to rozwiązanie, ale dodaję je, ponieważ jest to najnowsze i skuteczne rozwiązanie. Uwaga jest to mniej przenośne rozwiązanie, ale bardziej czytelne dla człowieka.

grep -R --exclude-dir=node_modules 'some pattern' /path/to/search

Rozwiązanie 3 (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, automatycznie ignoruje pliki i katalogi wymienione w .gitignore, więc nie masz aby kontynuować przekazywanie tych samych uciążliwych opcji wykluczenia do grep lub find.

 145
Author: hornetbzz,
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-02-16 14:10:10

Najnowsze wersje GNU Grep (>= 2.5.2) podać:

--exclude-dir=dir

Który wyklucza katalogi pasujące do wzorca dir z rekurencyjnych wyszukiwań katalogów.

Więc możesz zrobić:

grep -R --exclude-dir=node_modules 'some pattern' /path/to/search

Aby uzyskać więcej informacji na temat składni i użycia zobacz

Dla starszych GNU Greps i POSIX Grep, użyj find zgodnie z sugestią w innych odpowiedziach.

Lub po prostu użyj ack (Edit : lub Poszukiwacz Srebra) i skończ z tym!

 844
Author: Johnsyweb,
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-16 22:04:55

Jeśli chcesz wykluczyć wiele katalogów:

"r" dla rekurencyjnego, " l "wypisuje tylko nazwy plików zawierających dopasowania i" i " ignoruje rozróżnienia wielkości liter:


grep -rli --exclude-dir={dir1,dir2,dir3} keyword /path/to/search

przykład : Chcę znaleźć pliki zawierające słowo 'hello'. Chcę przeszukać wszystkie moje katalogi linuksowe z wyjątkiem proc katalog, boot katalog, sys katalog i root katalog :


grep -rli --exclude-dir={proc,boot,root,sys} hello /

Uwaga: powyższy przykład musi być root

Uwaga 2 ( według @skplunkerin): nie dodawaj spacji po przecinkach w {dir1,dir2,dir3}

 59
Author: Azodium,
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-08 20:30:04

Ta składnia

--exclude-dir={dir1,dir2}

Jest rozwijane przez powłokę (np. Bash), a nie przez grep, do tego:

--exclude-dir=dir1 --exclude-dir=dir2

Cytowanie uniemożliwi rozszerzenie powłoki, więc to nie zadziała:

--exclude-dir='{dir1,dir2}'    <-- this won't work

Wzorce używane z --exclude-dir są tego samego rodzaju wzorcami opisanymi na stronie podręcznika dla opcji --exclude:

--exclude=GLOB
    Skip files whose base name matches GLOB (using wildcard matching).
    A file-name glob can use *, ?, and [...]  as wildcards, and \ to
    quote a wildcard or backslash character literally.

Powłoka zazwyczajspróbuje rozwinąć taki wzór, więc aby tego uniknąć, należy go zacytować:

--exclude-dir='dir?'

Możesz użyć curly szelki i cytaty wykluczają wzory razem tak:

--exclude-dir={'dir?','dir??'}

Wzór może obejmować wiele segmentów ścieżki:

--exclude-dir='some*/?lse'

To wykluczy katalog podobny do topdir/something/else.

 17
Author: Derek Veit,
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-21 22:48:48

Często używaj tego:

grep może być używany w połączeniu z -r (rekurencyjne), i (ignoruj wielkość liter) i -o (wypisuje tylko pasujące części linii). Aby wykluczyć files użyj --exclude, a aby wykluczyć katalogi użyj --exclude-dir.

Składając to razem, kończysz z czymś takim:

grep -rio --exclude={filenames comma separated} \
--exclude-dir={directory names comma separated} <search term> <location>
Opisanie tego sprawia, że brzmi to o wiele bardziej skomplikowanie niż w rzeczywistości. Łatwiej zilustrować prostym przykładem.

Przykład:

Załóżmy, że szukam bieżącego projektu dla wszystkich miejsc, w których jawnie ustawiłem wartość ciągu debugger podczas sesji debugowania, a teraz chcę przejrzeć / usunąć.

Piszę skrypt o nazwie findDebugger.sh i używam grep, aby znaleźć wszystkie zdarzenia. Jednakże:

W przypadku wykluczeń plików-chcę się upewnić, że .eslintrc jest ignorowany(w rzeczywistości ma ona regułę lintingu o debugger, więc powinna być wykluczona). Podobnie, nie chcę, aby mój własny skrypt był odwoływany w żadnych wynikach.

Dla wykluczeń katalogowych-chciałbym wykluczyć node_modules, ponieważ zawiera wiele bibliotek, które odwołują się do debugger i nie jestem zainteresowany tymi wynikami. Poza tym po prostu chcę pominąć .idea i .git Ukryte katalogi, ponieważ nie dbam o te lokalizacje wyszukiwania, a chcę zachować wyszukiwarkę.

Oto wynik-tworzę skrypt o nazwie findDebugger.sh z:

#!/usr/bin/env bash
grep -rio --exclude={.eslintrc,findDebugger.sh} \
--exclude-dir={node_modules,.idea,.git} debugger .
 13
Author: arcseldon,
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-06-26 09:28:23

Możesz spróbować czegoś podobnego grep -R search . | grep -v '^node_modules/.*'

 8
Author: DipSwitch,
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
2011-07-03 20:53:18

Bardzo przydatne, szczególnie dla osób zajmujących się węzłem.js gdzie chcemy uniknąć przeszukiwania wewnątrz "node_modules":

find ./ -not -path "*/node_modules/*" -name "*.js" | xargs grep keyword
 4
Author: Nestor Urquiza,
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-02-11 21:00:55

This one works for me

grep <stuff> -R --exclude-dir=<your_dir>

 2
Author: angelo.mastro,
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-24 11:18:28

Proste polecenie robocze:

root/dspace# grep -r --exclude-dir={log,assetstore} "creativecommons.org"

Powyżej i grep dla tekstu "creativecommons.org "w bieżącym katalogu" dspace " i wyklucz dirs {log, assetstore}.

Zrobione.
 2
Author: Dung,
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-24 14:23:54
find . ! -name "node_modules" -type d 
 1
Author: Jack,
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
2011-12-28 12:45:48

Jeśli poszukujesz kodu w repozytorium git, a {[1] } znajduje się w twoim .gitignore, możesz użyć git grep. git grep przeszukuje śledzone pliki w drzewie roboczym, ignorując wszystko z .gitignore

git grep "STUFF"
 1
Author: 0xcaff,
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-09-08 15:39:52

Prostszym sposobem byłoby filtrowanie wyników za pomocą"grep-v".

grep -i needle -R * | grep -v node_modules

 0
Author: Morris,
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-10-22 18:18:19