Ich habe 'grep' jahrzehntelang genossen, aber ich habe Linux Jahre später verlassen und bin wieder zurückgekommen, wobei ich festgestellt habe, dass 'grep' anders funktioniert als vorher. Ich habe seine Verwendung im Internet überprüft und bestätigt, dass mein Speicher nicht beschädigt ist.
Ich bin sicher, dass sich einige *.h
Dateien *.cpp
in tieferen Unterverzeichnissen befinden. Ich habe die folgenden Befehle verwendet und unerwartet ähnliche Ergebnisse erhalten:
grep 44738 -r -l *.h
grep 44738 -r -l *.c
grep 44738 -r -l *.c*
Ich habe das Ergebnis von
grep: *.h: No such file or directory
./daemons/snmpcd/snmpcd.cpp
./.svn/pris.......svn-base
grep: *.c: No such file or directory
./daemons/snmpcd/snmpcd.cpp
./.svn/pris.......svn-base
grep: *.c*: No such file or directory
./daemons/snmpcd/snmpcd.cpp
./.svn/pris........svn-base
jeweils.
- Wenn ich command: verwendet habe
grep 44738 -r -l .
, habe ich das gleiche Ergebnis erhalten, mit Ausnahme der ersten Zeile vongrep: ...
- Wenn ich den Befehl „“ verwendet habe
grep 44738 -r -l *.c*
, kam ichgrep: ...
ohne Dateien aus. - Wenn ich command: verwendet habe
grep 44738 -r -l -file *.c* .
, bekomme ich nurgrep: *.c*: No such file or directory
Das Ergebnis widerspricht fast meiner Erfahrung vor einigen Jahren. Meine Fragen sind:
- Gab es bei Ubuntu 18.04.6 viele Änderungen
grep
? - Wie kann ich Dateimuster in grep angeben? Warum kann ich keine Muster wie verwenden
*.c
,*.h
*.c*
wie ich es vor Jahren getan habe? - Mein Kollege hat mir vorgeschlagen, zu verwenden
ack
, aber ich habe fast das Gleiche gefunden. Welche Befehle sollte ich wie zuvor für die globale Zeichenfolgensuche verwendengrep
?
Antwort1
Hier gibt es zwei Probleme. Erstens können Sie die Flags -r
oder nicht kombinieren -R
und gleichzeitig Zieldateinamen als Argumente angeben. Das -r
/ -R
aktiviert die rekursive Suche, was bedeutet, dass „alle Dateien in den angegebenen Verzeichnissen durchsucht werden“, sodass grep
das Argument als Verzeichnis behandelt wird, in dem nach Dateien gesucht werden soll. Da es kein Verzeichnis gibt, dessen Name mit dem *.c*
Glob übereinstimmt, erhalten Sie den angezeigten Fehler. Soweit ich mich erinnern kann, war dies immer der Fall, zumindest seit ich Linux verwende, was nun fast 25 Jahre her ist.
Sie können Globs beliebig verwenden, wenn Sie die -r
/ -R
-Flags nicht verwenden.AberSie müssen sie in Anführungszeichen setzen, das ist unbedingt erforderlich. Wenn Sie sie nicht in Anführungszeichen setzen, wie Sie es getan haben, wird der Glob von der Shell auf alle übereinstimmenden Dateien erweitert und grep
sieht nicht den Glob, sondern nur das Ergebnis der Erweiterung durch die Shell, also nur alle Dateien oder Verzeichnisse im aktuellen Verzeichnis, deren Namen mit dem Glob übereinstimmen.
GNU grep
, die Standardeinstellung unter Linux, bietet zwar eine Möglichkeit, das Gewünschte zu tun, die Syntax ist jedoch anders:
grep 44738 -r -l --include='*.h'
Sehen man grep
:
--include=GLOB
Search only files whose base name matches GLOB (using wildcard
matching as described under --exclude). If contradictory
--include and --exclude options are given, the last matching
one wins. If no --include or --exclude options match, a file
is included unless the first such option is --include.