Chcę znaleźć wszystkie wystąpienia foo
w dużym systemie plików obsługiwanym przez SVN, ale nie chcę dopasowywać niczego zawartego w żadnym .svn
katalogu.
Dostaję natychmiastowe dopasowania, gdy to robię, grep -l -e 'foo' *
ale kiedy próbuję wykluczyć katalogi svn, grep -l -e 'foo' --exclude-dir=".svn"
polecenie po prostu się zawiesza.
Co ja robię źle?
*
na.
, na wypadek, gdyby były inne ukryte foldery, które należy przeszukać.--recursive .
zamiast tego użyć , ponieważ OP ma już GNUgrep
.shopt -s dotglob
w Bash, więc*
już zawiera pliki kropek.-r
jest fajny, aleack
robi to też domyślnie :)Możesz być zainteresowany potwierdzeniem . Wykonuje wyszukiwanie rekurencyjne (i inne operacje podobne do grep) i domyślnie wyklucza katalogi takie jak .svn lub .git .
źródło
ag
, który podobny, ale szybszy.grep --exclude-dir...
Rozwiązanie powinno być w porządku, ale po prostu pokazać w inny sposób, można to zrobić zfind
„s-prune
:Jeśli chcesz wykonać coś dalej,
find
lepiej niż zwykłygrep -r
:źródło
Jeśli nie chcesz grepować do katalogów jak
.svn
nigdy dotąd , możesz ustawić$GREP_OPTIONS
zmienną, aby wykluczyć ją jak poniżej:Po prostu dodaj ten wiersz do swojego,
.bashrc
a rekurencyjne greps nie będą już wchodzić do.svn
katalogów. Oczywiście może być tak bogaty, jak chcesz:źródło
Oto także rozwiązanie awk:
Zasadniczo, ze wszystkich plików, przycinaj te, które pasują do /.svn/, a następnie, z nich, drukuj tylko te, które pasują do / foo /. Podoba mi się również to rozwiązanie, ponieważ możesz łatwo korzystać z wyników za pomocą ls. Na przykład możesz użyć
aby zobaczyć widok listy posortowany według daty modyfikacji. Ponadto dobrze jest mieć pełną ścieżkę wyników, jeśli chcesz zrobić z nimi coś innego (otwórz je, uruchom itp.)
źródło