So suchen Sie unter Linux nach einem Wort im gesamten Inhalt eines Verzeichnisses


15

müssen nach etwas im gesamten Inhalt suchen

Ich versuche:

find . | xargs grep word

Ich erhalte eine Fehlermeldung:

xargs: unbefristetes Zitat

Wie kann man das erreichen?

Antworten:


15

xargsErwartet Eingaben in einem Format, das von keinem anderen Befehl erstellt wird, sodass eine effektive Verwendung schwierig ist. Was hier falsch läuft, ist, dass Sie eine Datei haben, deren Name bei der Eingabe in Anführungszeichen gesetzt werden muss xargs(wahrscheinlich mit einem ').

Wenn Ihr grep die Option -roder -Rfür die rekursive Suche unterstützt, verwenden Sie sie.

grep -r word .

Verwenden Sie andernfalls die -execPrimärdaten von find. Dies ist die übliche Methode, um den gleichen Effekt wie zu erzielen xargs, außer ohne Einschränkungen bei den Dateinamen. Mit den neuesten Versionen von findkönnen Sie mehrere Dateien in einem einzigen Aufruf des Hilfsbefehls gruppieren. Durch /dev/nulldie Übergabe an wird grepsichergestellt, dass der Dateiname vor jeder Übereinstimmung angezeigt wird, auch wenn er zufällig für eine einzelne Datei aufgerufen wird.

find . -type f -exec grep word /dev/null {} +

Ältere Versionen von find(auf älteren Systemen oder OpenBSD oder reduzierten Dienstprogrammen wie BusyBox) können den AUX-Befehl immer nur für eine Datei gleichzeitig aufrufen.

find . -type f -exec grep word /dev/null {} \;

Einige Versionen von findund xargshaben Erweiterungen, mit denen sie korrekt kommunizieren können. Dabei werden Nullzeichen verwendet, um Dateinamen zu trennen, sodass keine Anführungszeichen erforderlich sind. Heutzutage hat nur OpenBSD diese Funktion ohne -exec … {} +.

find . -type f -print0 | xargs -0 grep word /dev/null

+1 speziell für /dev/null. Es ist ärgerlich, wenn das Ausgabeformat variieren kann, je nachdem, wie viele Dateien übereinstimmen ... danke.
Peter.O

12

Ich denke du meinst die erste Option

grep rekursiv, zum Durchsuchen von Inhalten in Dateien

grep -R "content_to_search" /path/to/directory

Es ist rekursiv, um nach passenden Dateien zu suchen

ls -lR | grep "your_search"

grep -rin für rekursive-case_insensitive-show_line_number

Ich möchte in der Lage sein, den Inhalt jeder Datei zu durchsuchen.

der erste gibt ein beliebiges Vorkommen in einer beliebigen Datei zurück und gibt die Datei an, in der das Vorkommen gefunden wurde

2

Wenn Sie die GNU-Tools haben (was Sie tun, wenn das Linux-Tag korrekt ist), können Sie -print0und verwenden -0, um die üblichen Probleme beim Zitieren zu umgehen:

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

0

Es gibt auch ack , speziell wie spezielle Verzeichnisse überspringen .svn, .gitund so weiter . Es ist ein tägliches Tool für Entwickler.

Es ist ziemlich nah dran, nach den üblichen Schaltern zu .

Ex. :

ack -r string .

Paket ack-grepauf debian & debian likes.



-1

Ich denke, Sie möchten eine Zeichenfolge in Dateien finden

Versuchen find . -name "*" | xargs grep -l "string"


Die Fehlermeldung von xargs ("Unterminated quote") bedeutet, dass das OP eine Datei enthält. das hat ein Zitat im Namen. Ihre Linie krächzt auch darüber. Wie bereits erwähnt, benötigen Sie eine andere Terminierung.
Thiton
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.