Jak mogę wykluczyć katalogi z grep-r?
Chcę przemierzać wszystkie podkatalogi, z wyjątkiem katalogu "node_modules".
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
.
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
- strona podręcznika GNU dla wyboru plików i katalogów
- A related StackOverflow answer Use grep --exclude/--include syntax to not grep through certain pliki
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!
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}
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
.
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 .
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/.*'
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
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>
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.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
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"
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
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