Wie heißt das Symbol *. *?

Antworten:

20

Interpretation *.*unter alten Windows / DOS-Systemen

Die Bedeutung hier hängt mehr mit Windows / DOS zusammen als mit Unix / Linux. Auf alten Windows / DOS-Systemen war es ein 'Wildcard'-Muster. Wildcard-Muster wurden verwendet, um Dateinamen auf ähnliche Weise wie Unix-Globs abzugleichen. Der *.*Platzhalter wurde üblicherweise für jede Datei verwendet.

Wie bei einem Unix-Glob stimmt das mit einer *beliebigen Folge von Zeichen in einem Dateinamen überein, so dass es *für sich genommen auch mit einer beliebigen Datei übereinstimmt. Der Grund für *.*die Übereinstimmung mit Dateinamen liegt jedoch in der unterschiedlichen Funktionsweise dieser Platzhalter. Nach diesem Artikel :

Alle Zeichen außer einem Punkt nach einem Sternchen haben keine Auswirkung, da der Sternchen den Cursor auf Position 12 bewegt. An diesem Punkt ändert nichts den Analysezustand außer einem Punkt, der die letzten drei Positionen löscht und den Cursor bewegt.

Dieses Verhalten (aus Unix-Sicht etwas merkwürdig) bedeutet, dass ein Punkt nach einem *nicht mit einem Punkt übereinstimmt, sondern nur eine hackige Methode ist, mit der Sie dem Muster weitere Zeichen hinzufügen können. Das bedeutet, dass das Hinzufügen eines weiteren *Objekts mit den letzten drei Positionen übereinstimmt.

Dies ist etwas sinnvoller, wenn Sie bedenken, dass die Syntax auf DOS- und alten Windows-Systemen vor Windows 95 verwendet wurde, für die 8.3-Dateinamen erforderlich waren . Diese Dateinamen durften nur einen Punkt und höchstens drei Zeichen nach dem Punkt haben. Die meisten, wenn nicht alle Dateien auf dem System eine dreistellige Erweiterung haben würden (obwohl technisch gesehen eine kürzere oder gar keine Erweiterung zulässig war), so ist es meiner Meinung nach sinnvoll *.*, jede Datei abzugleichen (zumindest aus der Perspektive einer verzerrten Windowsey-Logik) ).

Interpretation *.*in Unix-Shells

In Unix-Shells stellt dies, wie andere bereits betont haben, eine "Pfadnamenerweiterung" oder "Glob" dar. Das *hat kein seltsames Springen zum Endverhalten und führt daher nicht dazu, dass nachfolgende Zeichen ignoriert werden. *.*Das Muster passt zu jedem Dateinamen, der einen Punkt enthält (außer am Anfang). Dies entspricht definitiv keiner Datei, da es auf einem Unix / Linux-System viele Dateien gibt, die keine Erweiterung haben (oder auf andere Weise einen Punkt enthalten, da dies ebenfalls zulässig ist).

Der Grund dafür, *.*dass unter Unix am Anfang der Dateinamen kein Punkt gefunden wird, liegt darin, dass beim Platzieren eines Punkts die Dateien "versteckt" werden und versteckte Dateien standardmäßig von Globs ausgeschlossen werden. Um sie in einer POSIX-Shell abzugleichen, muss ein Punkt explizit am Anfang des Musters platziert werden. In bashder dotglobShell kann die Option gesetzt werden oder die GLOBIGNOREVariable kann passend gesetzt werden, aber das ist eine andere Frage!

Graeme
quelle
1
Es sollte beachtet werden, dass sich aktuelle Windows-Versionen logischer zu verhalten scheinen. Insbesondere "Alle Zeichen außer einem Punkt nach einem Sternchen haben keine Wirkung mehr" sind nicht mehr gültig. Zumindest beim Filtern von Dateien in einem Standarddialogfeld zum Öffnen von Dateien unter Windows 7 nach dem Muster *7.*werden alle Dateien abgerufen , deren letztes Zeichen vor der Erweiterung a 7steht. Mit *sa*werden alle Dateien saabgerufen , die die Teilzeichenfolge an einer beliebigen Stelle im Dateinamen usw. enthalten. (Dementsprechend trägt der Artikel, den Sie zitieren, den Titel " Wie haben Wildcards in MS-DOS funktioniert ?" (Hervorhebung von mir hinzugefügt).)
ODER Mapper
1
@ORMapper hat die Header aktualisiert, um dies widerzuspiegeln. Dieses Verhalten ist vor Windows 95, was in der Antwort steht (obwohl der Header irreführend war).
Graeme
11

Es ist globin Bash, unten habe ich aus Bash-Handbuch zitiert:

Bash - GNU Bourne-Again SHell

*

Entspricht einer beliebigen Zeichenfolge, einschließlich der Nullzeichenfolge. Wenn die Globstar-Shell-Option aktiviert ist und *in einem Pfadnamen-Erweiterungskontext *sverwendet wird, stimmen zwei benachbarte Muster , die als ein einziges Muster verwendet werden, mit allen Dateien und null oder mehr Verzeichnissen und Unterverzeichnissen überein. Wenn gefolgt von a /, *sstimmen zwei benachbarte nur mit Verzeichnissen und Unterverzeichnissen überein.

In diesem Fall *.*stimmen Sie mit allen Dateien überein, .deren Name einen Punkt enthält .

Weitere Details finden Sie hier .

cuonglm
quelle
8

Das Sternchen *ist eine globShell-Sprache. Zitieren aus der Shell-Befehlssprache :

Das Sternchen ( '*') ist ein Muster, das mit einer beliebigen Zeichenfolge übereinstimmen soll, einschließlich der Nullzeichenfolge.

Es stimmt jedoch nicht mit Dateinamen überein, die mit a beginnen, es .sei denn, die Shell-Option dotglobist aktiviert.

Wenn Sie es verwenden *.*, passt es zu allem, was:

  • beginnt nicht mit a .
  • enthält mindestens einen .

Möglicherweise möchten Sie auch auf Dateinamenerweiterung im Handbuch verweisen .

devnull
quelle
6

Viele Leute, die von Windows kommen, denken, dass dies *.*für alle Dateien gilt. Unter Windows ist es das. Unter UNIX sind es alle Dateien, deren Name mindestens einen Punkt enthält. *für sich allein funktioniert gut in Windows (aus dem frühen DOS); Allerdings wurden die alten Lehrbücher veröffentlicht *.*und es scheint eine schwierige Angewohnheit zu sein, diese zu brechen.

Joshua
quelle
4

*ist ein Platzhalter, der von der Shell verwendet wird, um die Dateinamenerweiterung durchzuführen , auch bekannt als "Globbing". *dehnt sich auf alles aus, einschließlich nichts (z. B. *.*wird übereinstimmen file., usw.). Der andere gebräuchliche Platzhalter ist ?, der jedem einzelnen Zeichen entspricht.

Verwechseln Sie die Funktion dieser Platzhalter nicht mit der Verwendung derselben Zeichen in regulären Ausdrücken (z. B. mit grep).

Goldlöckchen
quelle
3

Das ist Stern-Punkt-Stern - zumindest in der DOS-Welt (und später natürlich in der Windows-Welt). In DOS hat der Punkt .eine besondere magische Bedeutung, da die Dateinamen eine achtstellige Basis (später erweitert, aber wir bleiben bei der alten Schule) und eine dreistellige Erweiterung (die den Dateityp definiert) sind. In Unix wird der Dateityp normalerweise durch die ersten zwei Bytes der Datei (oder andere magische Zeichen) definiert, und die Erweiterung ist informativ, hat aber keine große Bedeutung. Außer wenn dies alles verschwommen ist.

In Unix gibt es also keine besondere Bedeutung. Das Sternchen ist ein "Globbing" -Zeichen in Unix-Shells und ein Platzhalter für eine beliebige Anzahl von Zeichen (einschließlich Null). ?ist ein weiteres häufig vorkommendes Zeichen, das genau mit einem beliebigen Zeichen übereinstimmt .

*.*Stimmt mit allen Dateinamen überein, die mindestens einen enthalten .. Es hat keinen speziellen Namen oder irgendeine Bedeutung mehr als *a*oder *_*. Und *.?würde alle Dateien mit einem Punkt und genau einem Zeichen nach diesem Punkt abgleichen. Es gibt auch einige kompliziertere erweiterte Globbing-Muster - siehe die Manpage Ihrer Shell.

Das "New Hacker's Dictionary" (eine Erweiterung der alten MIT "Jargon File") stellt fest, dass "star" der gebräuchlichste Name für das *Symbol ist (gefolgt von splat), und ich denke, dass dies in der Praxis immer noch zutrifft und .definitiv üblich ist. " dot ", obwohl es keine besondere Bedeutung als konglomeriertes Symbol hat, heißt die Sequenz unter Unix vernünftigerweise immer noch star-dot-star . (Es ist nur weniger nützlich.)

mattdm
quelle
Das mag seltsam klingen, aber danke, dass Sie "star dot star" erwähnt haben. Das hat diese Seite googleable gemacht!
Score_Under
3

Hier gibt es eigentlich 2 Symbole, Sternchen *und Punkt .. Die Shells interpretieren normalerweise nur das Sternchen als ein beliebiges Zeichen, aber in Regex würde dies eine gierige Kugel bedeuten. In diesem Fall würde es mit allem übereinstimmen, das nicht mit einem Punkt endet oder beginnt, aber mindestens einen enthält:

somefile.dot # match
.dot.between.words. # match
.onlydotatstart # don't match
onlydotatend. # match
.startandenddot. # don't match
Braiam
quelle
1
Ihr onlydotatend.Fall ist sicherlich ein Spiel?
Graeme
@Graeme Nö. touch 'onlydotatend.' && echo *.*gibt es nicht zurück
Braiam
1
Tut für mich! Auf beiden bashund dash. Welche Shell benutzt du?
Graeme
@Graeme zsh, und Sie haben Recht bash nicht.
Braiam
Ich habe es gerade mit einer Vanille- zshKonfiguration versucht und es funktioniert auch dort. Ich verstehe nicht, warum onlydotatend.es keine Übereinstimmung geben kann. Gibt es dafür eine Konfigurationsoption?
Graeme