Während wir *
verwenden um null oder mehr vorherige Zeichen in grep
zu bezeichnen verwenden wir *.c
um alle C-Dateien zu finden, wenn wir es mit ls
verwenden Befehl wie ls *.c
. Könnte jemand sagen, wie die Verwendung von *
unterscheidet sich in diesen beiden Fällen?
Akzeptierte Antwort:
Shell-Dateinamen-Globing und reguläre Ausdrücke verwenden einige der gleichen Zeichen und haben ähnliche Zwecke, aber Sie haben Recht, sie sind nicht kompatibel. File Name Globbing ist ein viel weniger leistungsfähiges System.
Globbing im Dateinamen:
-
*
bedeutet „null oder mehr Zeichen“ -
?
bedeutet „jedes einzelne Zeichen“
Aber in regulären Ausdrücken müssen Sie .*
verwenden bedeutet „null oder mehr Zeichen“ und .
bedeutet „jedes einzelne Zeichen“. Ein ?
bedeutet in Regexes etwas ganz anderes:null oder eine Instanz des vorangehenden RE-Elements.
Eckige Klammern ([]
) scheinen in beiden Systemen auf dem System, auf dem ich dies schreibe, gleich zu funktionieren, zumindest für einfache Fälle. Dazu gehören Dinge wie POSIX-Zeichenklassen (z. B. [:alpha:]
). Wenn Ihre Befehle jedoch auf vielen verschiedenen Systemtypen funktionieren sollen, rate ich davon ab, etwas anderes als elementare Dinge wie Zeichenlisten zu verwenden (z. B. [abeq]
) und eventuell Zeichenbereiche (z.B. [a-c]
).
Aufgrund dieser Unterschiede sind die beiden Systeme nur für einfache Fälle direkt austauschbar. Wenn Sie einen Regex-Abgleich von Dateinamen benötigen, müssen Sie es auf andere Weise tun. find -regex
ist eine Option. (Beachten Sie, dass es auch find -name
gibt , die übrigens Glob-Syntax verwendet.)