GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Durchsuchen einer Reihe von Dateien nach einem String in LInux

Lösung 1:

Sie könnten grep:

verwenden
grep -rn 'classname' /path/to/source

Dadurch wird auch die Zeilennummer neben jedem Treffer gedruckt.

Groß-/Kleinschreibung wird nicht beachtet:

grep -rin 'classname' /path/to/source

Nicht rekursiv in allen cpp-Dateien suchen:

grep -n 'classname' /path/to/source/*.cpp

Lösung 2:

Alle oben genannten Antworten funktionieren einwandfrei, können jedoch zu Fehlalarmen führen, wenn Sie die Zeichenfolge in mehr als nur im Quellcode haben. Angenommen, Sie suchen, wo Sie die FooBar-Klasse in einem Java-Projekt verwenden, Sie können nach allen Dateien namens *.java suchen und nur diese grep.

# grep "FooBar" -Hn $(find -name "*.java")

Der Abschnitt zwischen $() wird zur Ausgabe dieses Befehls erweitert. Das -H gibt den Dateinamen aus. Es ist die Standardeinstellung, wenn es mehr als einen Dateinamen gibt, aber wir fügen es hier explizit hinzu, falls die Erweiterung nur einen Dateinamen zurückgibt. Das -n gibt die Zeilennummer des Treffers aus.

Dies funktioniert für kleine Projekte, aber wenn Sie es mit einem größeren Projekt zu tun haben, besteht die Möglichkeit, dass die Suche auf eine Zeichenfolge erweitert wird, die länger als das Befehlszeilenlimit ist. Es ist daher sicherer zu verwenden:

# find -name "*.java" -print0 | xargs -0 grep "FooBar" -Hn 

xargs übernimmt Eingaben von Standard in und teilt sie so auf, dass sie in die Befehlszeile passen, wobei der Befehl bei Bedarf mehrmals ausgeführt wird. -print0 und -0 sind erforderlich, um mit Dateien mit Leerzeichen in ihrem Namen umzugehen.

Sie können auch nach allen Dateinamen mit einer Übereinstimmung suchen, indem Sie Folgendes verwenden:

# find -name "*.java" -print0 | xargs -0 grep "FooBar" -l

Das -l zeigt nur den Dateinamen an und hört auf, in einer bestimmten Datei zu suchen, sobald es eine Übereinstimmung findet.

Wenn Sie so etwas häufig tun, sollten Sie sich ein Tool wie ctags oder exuberant tags ansehen, die einen Suchindex Ihres Quellcodes verwalten und diese Art von Fragen schnell beantworten können. Sowohl vim als auch emacs unterstützen diese Tools. Vielleicht möchten Sie sich auch eine IDE wie Eclipse ansehen, die Querverweise sehr gut ausführen kann.

(Ich weiß, dass Sie nach einer Klassendefinition gesucht haben, aber in Java wird eine Klasse in einer Datei mit demselben Namen wie die Klasse definiert. Wenn Sie cpp verwenden, könnten Sie Folgendes tun:

# find -name "*.cpp" -o -name "*.cc" -o -name "*.h" -o -name "*.hpp" -print0 | \
  xargs -0 egrep "class\s+FooBar" -Hn 

Lösung 3:

Beim Durchsuchen des Quellcodes habe ich festgestellt, dass ack (betterthangrep.com) besser ist als grep, um das Marketing zu zitieren. Seine Ausgabe ist einfacher zu lesen und es erledigt viele Dinge automatisch, wie das Ignorieren von Nicht-Quellcode-Dateien:VCS-Verzeichnisse (zB CVS und .svn), Sicherungsdateien.

Lösung 4:

ack eignet sich besser zum Durchsuchen von Quellcodes, da es bereits einige der beliebtesten Dateierweiterungen (c, perl usw.) erkennt. Es ist so schnell wie grep und ignoriert standardmäßig alle Ihre Versionskontrollartefakte. Wenn Sie zum Beispiel einen Muster-Perl-Quellcode suchen möchten, können Sie dies verwenden

ack --perl pattern

statt

grep pattern $(find . -name '*.pl' -or -name '*.pm' -or -name '*.pod' | grep -v .svn)

Linux
  1. So erhöhen Sie das Limit für die Anzahl der geöffneten Dateien in Linux

  2. Linux – Woher wissen Sie, wofür Sie in Dmesg grep müssen?

  3. Überprüfen Sie die Linux-Konfigurationsdateien auf Syntaxfehler

  4. Linux:Suchen Sie nach kürzlich geänderten Dateien des Typs *.php

  5. grep rekursiv für einen bestimmten Dateityp unter Linux

So kopieren Sie eine große Anzahl von Dateien unter Linux

Linux-Suche nach Zeichenfolgen in Ordnern und Dateien mit ack

Finden Sie Text in Dateien unter Linux mit grep

Zählen Sie die Anzahl der Dateien in einem Verzeichnis in Linux

So zählen Sie die Anzahl der Dateien in einem Verzeichnis in Linux

Dropbox für einen Linux Cloud Server eingerichtet