Rekurencyjnie przeszukuj folder, ale wyklucz podfolder SVN


10

Chcę znaleźć wszystkie wystąpienia foow dużym systemie plików obsługiwanym przez SVN, ale nie chcę dopasowywać niczego zawartego w żadnym .svnkatalogu.

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?

Odpowiedzi:


11

--exclude-dirnie zastępuje konieczności wyświetlania listy plików w wierszu poleceń. „Wieszasz”, ponieważ grepczeka na standardowe wejście.

grep -l -e 'foo' --exclude-dir = ". svn" *

Zastanów się nad użyciem ack , który .svndomyślnie wyklucza i podobne foldery (i ma wiele innych funkcji).


2
Czystsze, jeśli zmienisz *na ., na wypadek, gdyby były inne ukryte foldery, które należy przeszukać.
Kevin,

a może chcesz --recursive .zamiast tego użyć , ponieważ OP ma już GNU grep.
jw013

Osobiście mam shopt -s dotglobw Bash, więc *już zawiera pliki kropek. -rjest fajny, ale ackrobi to też domyślnie :)
efhemient

5

Możesz być zainteresowany potwierdzeniem . Wykonuje wyszukiwanie rekurencyjne (i inne operacje podobne do grep) i domyślnie wyklucza katalogi takie jak .svn lub .git .


Jako kontynuację tego, obecnie używam ag, który podobny, ale szybszy.
WhyNotHugo

2

grep --exclude-dir...Rozwiązanie powinno być w porządku, ale po prostu pokazać w inny sposób, można to zrobić z find„s -prune:

find -name .svn -prune -o -type f -exec grep -l "$pattern" {} +

Jeśli chcesz wykonać coś dalej, findlepiej niż zwykły grep -r:

find -name .svn -prune -o -type f -exec grep -q "$pattern" {} \; -exec ./process {} \;

1

Jeśli nie chcesz grepować do katalogów jak .svn nigdy dotąd , możesz ustawić $GREP_OPTIONSzmienną, aby wykluczyć ją jak poniżej:

export GREP_OPTIONS="--exclude-dir=\*/.svn/\*"

Po prostu dodaj ten wiersz do swojego, .bashrca rekurencyjne greps nie będą już wchodzić do .svnkatalogów. Oczywiście może być tak bogaty, jak chcesz:

export GREP_OPTIONS="--exclude-dir=\*/.svn/\* --exclude-dir=\*/.hg/\* --exclude-dir=\*/.git/\* --exclude=\*~"

1
Osobiście robię to za pomocą aliasu, aby móc ominąć listę wykluczeń, jeśli muszę faktycznie przeszukiwać te foldery, mogę po prostu używać grep bez konieczności cofania / zerowania zmiennej. Pozwala mi to również utrzymywać listę folderów, które mogę łatwo rozwinąć i które automatycznie dodałem do mojej listy wykluczeń bez konieczności pisania na klawiaturze.
dragon788

To dobre podejście. Ma również tę zaletę, że jeśli potrzebujesz grepować do folderów, nie zapomnisz, że ustawiłeś zmienną. (Nie to, że kiedykolwiek musiałem je grepować.) Ale TBH obecnie używam ag (klon Ack) do tych rzeczy ^^
brandizzi

0

Oto także rozwiązanie awk:

find . | awk '$0 !~ /.svn/{print}' | awk '/foo/{print}'

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ć

ls -tl $(find . | awk '$0 !~ /.svn/{print}' | awk '/foo/{print}')

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.)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.