Warum funktioniert dieses Grep nach einem String in allen Unterverzeichnissen nicht?

Warum funktioniert dieses Grep nach einem String in allen Unterverzeichnissen nicht?

Dies ist der Befehl, den ich ausführen möchte.

grep -r "printf" *.c

Ich versuche, alle printf-Zeilen aus allen .cin meinem cwd vorhandenen Dateien abzurufen. Mein aktuelles Verzeichnis ist derzeit Desktop, und ich habe mindestens 10-15 .cDateien in meinen Unterverzeichnissen unter Desktop, aber dieser Befehl zeigt überhaupt keine Übereinstimmungen an. Wie kann ich das also in diesem Fall zum Laufen bringen?

Antwort1

Wenn Sie tun:

grep -r "printf" *.c

Die Shell erweitert *.calle Dateien/Verzeichnisse .cin Ihrem aktuellen Verzeichnis, die auf enden. Wenn keine solche Datei/kein solches Verzeichnis vorhanden ist, wird das Muster wörtlich behandelt (vermutlich haben Sie es nicht nullglobfestgelegt).

Wie Sie sehen, geht Ihr aktuelles Muster nie unter das aktuelle Verzeichnis, da Sie keine .cDateien im aktuellen Verzeichnis haben oder, falls vorhanden, diese nicht vorhanden sind printf, was zu einer leeren Ausgabe führt.

Sie müssen --includenur in ausgewählten Dateien suchen und auch -rrekursiv durchlaufen:

grep -r --include="*.c" "printf" .

Das Obige sucht rekursiv in allen Dateien beginnend vom aktuellen Verzeichnis .cnach der Zeichenfolge (Muster) .printf

wenn Sie allen symbolischen Links folgen möchten:

grep -R --include="*.c" "printf" .

Antwort2

Wenn Sie wissen möchten, warum Ihr Befehl nicht funktioniert, lesen Siedie andere Antwort. Wenn Sie wissen möchten, wie es funktioniert, hier ist ein anderer Ansatz (kopiert von Grep in Dateien mit einer bestimmten Erweiterung in einem Verzeichnis mit kosmetischen Lokalisierungen), das die Fähigkeiten von bash und nicht die Fähigkeiten von nutzt grep (und daher für jeden Befehl funktioniert, wie etwa wc, cpoder tar, und nicht nur grep):

SeinschaltenSchelloption globstarmit dem Befehl

shopt -s globstar

Dies führt dazu, **dass als Dateinamenkomponente alles hier und unten gemeint ist. Wenn Sie sich also in befinden Desktop, **bedeutet dies alles im DesktopVerzeichnis und seine Unterverzeichnisse. Dann können Sie verwenden

grep "printf" **/*.c

um alle .cDateien in und unter zu durchsuchen Desktop. Sie müssen nicht angeben -r, da die Shell die Rekursion für Sie durchführt, und Sie müssen nicht angeben --include, da das Pfadnamenerweiterungsmuster (auch Glob oder Platzhalter genannt) enthält *.c.


Du kannstSienset-Optionen mit shopt -u.

verwandte Informationen