Was ist der beste Weg, um finden Sie einen string/regex-übereinstimmung in Dateien rekursiv?(UNIX)

StackOverflow https://stackoverflow.com/questions/186015

  •  06-07-2019
  •  | 
  •  

Frage

Ich habe dies mehrere Male, in der Regel, wenn Sie versuchen zu finden, in welchen Dateien eine variable oder eine Funktion verwendet wird.

Ich erinnere mich, mit xargs mit grep in die Vergangenheit, um dies zu tun, aber ich Frage mich, ob es irgendwelche gibt einfachere Wege.

War es hilfreich?

Lösung

grep -r REGEX .

Ersetzen . mit dem, was Verzeichnis Sie suchen möchten.

Andere Tipps

Die tragbare Methode *, dies zu tun ist

find . -type f -print0 | xargs -0 grep pattern

-print0 sagt finden ASCII nuls als Separator und -0 sagt xargs die gleiche Sache zu nutzen. Wenn Sie sie nicht verwenden, werden Sie Fehler auf Dateien und Verzeichnissen, die Leerzeichen in ihren Namen enthalten.

* im Gegensatz zu grep -r, grep -R oder --recursive grep, die nur auf einigen Rechnern arbeiten.

Dies ist einer der Fälle, für die ich angefangen habe mit ack ( http: / /petdance.com/ack/ ) anstelle von grep . Von der Website können Sie Anweisungen erhalten sie als Perl CPAN-Komponente zu installieren, oder Sie können eine in sich geschlossene Version erhalten, die ohne den Umgang mit Abhängigkeiten installiert werden kann.

Neben der Tatsache, dass es standardmäßig rekursive Suche ermöglicht es Ihnen, Perl-Stärke reguläre Ausdrücke zu verwenden, verwenden Sie regex die Dateien zu wählen, zu suchen, etc. Es hat eine beeindruckende Liste von Optionen. Ich empfehle den Besuch der Website und überprüft es heraus. Ich habe es sehr einfach gefunden zu verwenden, und es gibt Tipps für die es mit vi Integration (m), Emacs und sogar Textmate, wenn Sie diese verwenden.

Wenn Sie sich für einen String Match suchen, verwenden Sie

fgrep -r pattern .

, die schneller als grep. Mehr zu diesem Thema hier: http://www.mkssoftware.com/docs/man1 /grep.1.asp

grep -r wenn Sie mit GNU grep, die mit den meisten Linux-Distributionen kommt.

Bei den meisten UNIX-Varianten ist es nicht standardmäßig installiert, so versuchen Sie stattdessen:

finden. -Typ f | xargs grep regex

Wenn Sie die zsh Shell verwenden können Sie

grep REGEX **/*

oder

grep REGEX **/*.java

Dies kann die Puste aus, wenn es zu viele passenden Dateien sind.

Der kanonische Weg ist jedoch mit exec zu bedienen.

find . -name '*.java' -exec grep REGEX {} \;

oder

find . -type f -exec grep REGEX {} \;

Der ‚Typ f‘ Bit bedeutet nur, Dateityp und alle Dateien anzeigen lassen.

Ich schlage vor, die Änderung der Antwort an:

grep REGEX -r .

Der -r Schalter stellt keine regulären Ausdruck. Es sagt grep in das Verzeichnis rekursiv zur Verfügung gestellt.

Dies ist eine großartige Möglichkeit, um zu finden Sie die genauen Ausdruck rekursiv mit einer oder mehreren Dateitypen:

find . \\( -name '\''*.java'\'' -o -name '\''*.xml'\'' \\) | xargs egrep (interne Anführungszeichen)

Wo

-name '\''*.<filetype>'\'' -o (wieder einzelne Zitate hier)

wiederholt wird in den Klammern (), für wie viele weitere Dateitypen, die Sie hinzufügen möchten, um Ihre rekursive Suche

ein alias sieht in bash

alias fnd='find . \\( -name '\''*.java'\'' -o -name '\''*.xml'\'' \\) | xargs egrep'

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top