Come si chiama il simbolo *. *?


Risposte:


20

Interpretazione dei *.*vecchi sistemi Windows / DOS

Il significato qui è più legato a Windows / DOS che a Unix / Linux. Sui vecchi sistemi Windows / DOS era un modello "jolly". I pattern jolly sono stati usati per abbinare i nomi dei file in modo simile ai globs Unix. Il *.*carattere jolly veniva comunemente utilizzato per abbinare qualsiasi file.

Come con un glob Unix, *corrisponderà a qualsiasi sequenza di caratteri in un nome file, in quanto tale *corrisponderà anche a qualsiasi file. Tuttavia, il motivo per cui *.*corrisponderà anche a qualsiasi nome di file è dovuto alle differenze nel modo in cui funzionano questi caratteri jolly. Secondo questo articolo :

Qualsiasi carattere diverso da un punto che segue un asterisco non ha alcun effetto, poiché l'asterisco sposta il cursore in posizione 12, a quel punto nulla cambia lo stato di analisi tranne un punto, che cancella le ultime tre posizioni e sposta il cursore.

Questo comportamento (un po 'strano dalla prospettiva Unix) significa che un punto che segue a *non corrisponde effettivamente a un punto, ma è solo un modo hacker per consentire di aggiungere più caratteri al modello. Ciò significa che l'aggiunta di un altro *corrisponderà a qualsiasi cosa in queste ultime tre posizioni.

Questo ha un po 'più senso se si considera che la sintassi è stata utilizzata su DOS e vecchi sistemi Windows prima di Windows 95 che richiedeva nomi di file 8.3 . A questi nomi di file era consentito solo un punto e al massimo tre caratteri dopo il punto. La maggior parte, se non tutti i file sul sistema avessero un'estensione di tre caratteri (anche se tecnicamente era consentita un'estensione più breve o assente), quindi in qualche modo immagino avesse senso usare *.*per abbinare qualsiasi file (almeno da una prospettiva logica deformata di Windowsey ).

Interpretazione delle *.*conchiglie Unix

Nelle shell Unix, come altri hanno sottolineato, ciò rappresenta una "espansione del nome di percorso" o "glob". Il *non dispone di alcun salto strano il comportamento finale e pertanto non porta a caratteri seguenti esso viene ignorato. *.*il modello corrisponderà a qualsiasi nome di file contenente un punto (tranne all'inizio). Questo sicuramente non corrisponderà a nessun file poiché ci sono molti file su un sistema Unix / Linux che non hanno un'estensione (o altrimenti contengono un punto poiché anche questo è permesso).

Il motivo per cui *.*non si trova un punto all'inizio dei nomi dei file su Unix è perché mettere un punto all'inizio è come i file sono "nascosti" e i file nascosti sono esclusi dai globs per impostazione predefinita. Per abbinarli in una shell POSIX, è necessario inserire esplicitamente un punto all'inizio del modello. Nel bashl' dotglobopzione di shell può essere impostata o la GLOBIGNOREvariabile può essere impostato in modo appropriato, ma questa è un'altra questione!


1
Va notato che le attuali versioni di Windows sembrano comportarsi in modo più logico. In particolare, "Qualsiasi carattere diverso da un punto che segue un asterisco non ha alcun effetto" non è più vero; almeno quando si filtrano i file in una finestra di dialogo Apri file standard su Windows 7 in base al modello *7.*, ottengo tutti i file il cui ultimo carattere prima dell'estensione è un 7e *sa*, con , ottengo tutti i file che contengono la sottostringa saovunque nel nome del file e così via. (Di conseguenza, l'articolo lei cita è intitolato Come hanno fatto i caratteri jolly lavorano in MS-DOS ? (Enfasi aggiunta da me).)
O Mapper

1
@ORMapper, ho aggiornato le intestazioni per riflettere questo. Questo comportamento è precedente a Windows 95, che è nella risposta (sebbene l'intestazione fosse fuorviante).
Graeme,

11

È globin bash, di seguito ho citato dal manuale di bash:

bash - GNU Bourne-Again SHell

*

Corrisponde a qualsiasi stringa, inclusa la stringa null. Quando l'opzione della shell globstar è abilitata e *viene utilizzata in un contesto di espansione del nome percorso, due adiacenti *sutilizzati come un singolo modello corrisponderanno a tutti i file e zero o più directory e sottodirectory. Se seguito da un /, due adiacenti *scorrisponderanno solo alle directory e alle sottodirectory.

In questo caso, *.*abbina tutti i file che contengono un punto .nel suo nome.

Puoi vedere maggiori dettagli qui .


8

L'asterisco *è un globlinguaggio in shell. Citando da Shell Command Language :

L'asterisco ( '*') è un modello che deve corrispondere a qualsiasi stringa, inclusa la stringa nulla.

Tuttavia, non corrisponde ai nomi di file che iniziano con a a .meno che non dotglobsia impostata l'opzione shell .

Quando lo usi *.*, corrisponde a tutto ciò che:

  • non inizia con a .
  • ne contiene almeno uno .

Potresti anche fare riferimento a Espansione nome file nel manuale.


6

Molte persone provenienti da Windows pensano che *.*sia per tutti i file. Su Windows, lo è. Su UNIX, sono tutti i file che contengono almeno 1 punto nel loro nome. *di per sé funziona perfettamente in Windows (risalente ai primi DOS); tuttavia i vecchi libri di testo pubblicati *.*e sembra essere un'abitudine difficile da rompere.


4

*è un carattere jolly utilizzato dalla shell per eseguire l' espansione del nome file , noto anche come "globbing". *si espande in qualsiasi cosa, incluso nulla (ad es. *.*corrisponderà file., ecc.). L'altro carattere jolly comune è ?, che corrisponde a qualsiasi singolo carattere.

Non confondere la funzione di questi caratteri jolly con l'uso degli stessi caratteri nelle espressioni regolari (come quelli usati con grep).


3

Questo è star-dot-star - almeno, nel mondo DOS (e in seguito, ovviamente, Windows). In DOS, il punto .ha un significato magico speciale, perché i nomi dei file sono una base di otto caratteri (successivamente estesa, ma restiamo alla vecchia scuola) e un'estensione di tre caratteri (che ha definito il tipo di file). In Unix, il tipo di file è generalmente definito dai primi due byte del file (o altra magia) e l'estensione è informativa ma non ha molto significato. Tranne quando tutto è diventato sfocato.

Quindi, in Unix, non esiste un significato speciale. L'asterisco è un carattere "sconvolgente" nelle shell Unix ed è un jolly per qualsiasi numero di caratteri (incluso zero). ?è un altro personaggio comune travolgente, che corrisponde esattamente a uno di tutti i personaggi.

*.*corrisponde a tutti i nomi di file che ne contengono almeno uno .. Non ha un nome speciale o alcun significato più di *a*o *_*. E *.?corrisponderebbe a tutti i file con un punto e esattamente un carattere dopo quel punto. Ci sono anche alcuni schemi di globbing estesi più complicati - vedi la pagina man della tua shell.

Il "Dizionario del nuovo hacker" (un'espansione del vecchio "file Jargon" del MIT) rileva che "stella" è il nome più comune per il *simbolo (seguito da splat), e penso che sia ancora vero nella pratica, ed .è sicuramente comune " punto ", quindi, sebbene non abbia alcun significato speciale intrinseco come simbolo conglomerato, la sequenza è ancora ragionevolmente chiamata stella-punto-stella su Unix. (È solo meno utile.)


Potrebbe sembrare strano ma grazie per aver menzionato "stella a stella", è ciò che ha reso google la pagina!
Score_Under

3

Qui ci sono in realtà 2 simboli, asterisco *e punto .. Le conchiglie normalmente interpretano l'asterisco solo come qualsiasi personaggio, ma in regex significherebbe un glob goloso. In questo caso corrisponderebbe a tutto ciò che non termina o inizia con un punto, ma ne contiene almeno uno:

somefile.dot # match
.dot.between.words. # match
.onlydotatstart # don't match
onlydotatend. # match
.startandenddot. # don't match

1
Il tuo onlydotatend.caso è una partita, sicuramente?
Graeme,

@Graeme no. touch 'onlydotatend.' && echo *.*non lo restituisce
Braiam

1
Fa per me! Su entrambi bashe dash. Che shell stai usando?
Graeme,

@Graeme zsh, e hai ragione, bash no.
Braiam,

Ho appena provato questo su una zshconfigurazione vanilla e funziona anche lì. Non capisco come onlydotatend.non possa essere una corrispondenza, esiste un'opzione di configurazione che lo fa?
Graeme,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.