Znajdź ciąg tylko w określonym pliku w podkatalogach

10

Powiedzmy, że muszę znaleźć funkcję GetTypes()we wszystkich plikach źródłowych C # ( .cs) w katalogach / podkatalogach.

Użyłem grep -rn GetTypes *.cs, ale wystąpił błąd grep: *.cs: No such file or directory. Musiałem użyć grep -rn GetTypes *, ale w tym przypadku pokazuje wszystkie pliki nie *.cstylko.

Jakiego polecenia należy użyć, aby znaleźć ciąg tylko w .csplikach?

prosseek
źródło

Odpowiedzi:

12

Jeśli używasz powłoki bash ≥4, umieścić shopt -s globstarw twojej ~/.bashrc. Jeśli twoja powłoka to Zsh, jesteś dobry. Potem możesz biec

grep -n GetTypes **/*.cs

**/*.csoznacza wszystkie pliki pasujące *.csdo bieżącego katalogu lub jego podkatalogów rekurencyjnie.

Jeśli nie korzystasz z powłoki, która obsługuje, **ale obsługuje grep --include, możesz wykonać rekurencyjne grep i powiedzieć, grepaby rozważać tylko pliki pasujące do określonych wzorców. Zwróć uwagę na cytaty wokół wzorca nazwy pliku: jest on interpretowany przez grep, a nie przez powłokę.

grep -rn --include='*.cs' GetTypes .

Korzystając tylko z przenośnych narzędzi (niektóre systemy wcale tego nie mają grep -r), użyj finddla części przechodzenia do katalogu i grepdo wyszukiwania tekstu.

find . -name '*.cs' -exec grep -n GetTypes {} +
Gilles „SO- przestań być zły”
źródło
Do czasowego secie globstarrozwiązaniem dla aktualnego Bash 4+ powłoki, zastosowanie: shopt -s globstar.
tjanez
8

Powinieneś sprawdzić billiant mały grep / znaleźć zamiennik znany jako ack. Jest specjalnie skonfigurowany do przeszukiwania katalogów plików kodu źródłowego.

Twoje polecenie wyglądałoby tak:

ack --csharp GetTypes
Caleb
źródło
4

Jeśli używasz GNU grep, możesz określić, które pliki mają zostać uwzględnione w rekursywnym przechodzeniu do katalogu:

grep --include '*.cs' -rn GetTypes .

(gdzie ostatni okres oznacza bieżący katalog roboczy jako katalog główny przejścia)

maxschlepzig
źródło
4

Używam kombinacji find i grep:

find . -name "*.cs" | xargs grep "GetTypes" -bn --color=auto

Dla find, można zastąpić .przez katalogu i usunąć -name, jeśli chcesz wyglądać w każdym pliku.

Dla grep, -bnwydrukuje pozycję i numer linii i --colorpomoże twoim oczom, podkreślając to, czego szukasz.

Kevin
źródło