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?

xyz
quelle

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
Gilles 'SO - hör auf böse zu sein'
quelle
+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"
Feida Kila
quelle
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
mu ist zu kurz
quelle
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.

Gilles Quenot
quelle
0

Im aktuellen Verzeichnis können Sie grep verwenden:

 grep -irl root .
Ranjithkumar T
quelle
-1

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

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


quelle
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