Dies ist der Befehl, den ich ausführen möchte.
grep -r "printf" *.c
Ich versuche, alle printf-Zeilen aus allen .c
in meinem cwd vorhandenen Dateien abzurufen. Mein aktuelles Verzeichnis ist derzeit Desktop, und ich habe mindestens 10-15 .c
Dateien 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 *.c
alle Dateien/Verzeichnisse .c
in 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 nullglob
festgelegt).
Wie Sie sehen, geht Ihr aktuelles Muster nie unter das aktuelle Verzeichnis, da Sie keine .c
Dateien im aktuellen Verzeichnis haben oder, falls vorhanden, diese nicht vorhanden sind printf
, was zu einer leeren Ausgabe führt.
Sie müssen --include
nur in ausgewählten Dateien suchen und auch -r
rekursiv durchlaufen:
grep -r --include="*.c" "printf" .
Das Obige sucht rekursiv in allen Dateien beginnend vom aktuellen Verzeichnis .c
nach 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
, cp
oder tar
, und nicht nur grep
):
SeinschaltenSchelloption globstar
mit 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 Desktop
Verzeichnis
und seine Unterverzeichnisse. Dann können Sie verwenden
grep "printf" **/*.c
um alle .c
Dateien 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
.