"Grep -r foo *" vs "grep -r foo".

10

Bei Verwendung von grep -r können Sie in allen Dateien entweder mit * oder suchen. und es scheint dasselbe zurückzugeben, aber ist es wirklich dasselbe?

Nehmen wir an, ich suche nach "foo", dann könnte ich schreiben

grep -r foo *

oder

grep -r foo .

Würde jemand versuchen, den Unterschied zwischen zu erklären. und *?

Johan
quelle

Antworten:

15

grep -r foo *sucht nicht nach Übereinstimmungen in versteckten Dateien oder Verzeichnissen, wird auch *von der Shell erweitert, sodass Sie möglicherweise einen zu langen Fehler in der Argumentliste erhalten, wenn das aktuelle Verzeichnis viele Einträge enthält, oder andere Fehler oder Fehlverhalten, wenn die Der Name einiger Dateien oder Verzeichnisse beginnt mit einem Bindestrich.

Der Aufruf grep -r foo .weist nicht die oben genannten Mängel auf

Aktualisiert:

Ein weiterer Unterschied: Greps Manpage (@ fedora17) sagt:

-r, --recursive
    Read all files under each directory, recursively, following symbolic links only if they
    are on  the  command  line.  ...

Es gibt auch einen Unterschied, wenn Sie diesen Befehl in einem leeren Verzeichnis ausführen:

$ grep -r foo *; echo $?
grep: *: No such file or directory
2
$ grep -r foo .; echo $?
1
$
Otokan
quelle
4

Wenn Sie ein Sternchen verwenden, können Sie keine Dateien in Verzeichnissen abgleichen, deren Name mit einem Punkt beginnt, z .cache.

Aktualisieren:

Dies liegt daran, dass das *von der Shell vor dem Aufruf erweitert wird grep, sodass anstelle eines einzelnen Verzeichnisnamens (für den aktuellen Namen .) eine Liste mit Namen angezeigt wird . Die Art und Weise Shell das Muster erweitern kann (wie mit Shell - Parametern angepasst werden nullglob, nocasegloboder andere bashOptionen) oder Umgebungsvariablen sein (wie LANGoder LC_ALL)

eppesuig
quelle