Risposte:
*.*vecchi sistemi Windows / DOSIl 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 ).
*.*conchiglie UnixNelle 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!
È 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 .
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:
..Potresti anche fare riferimento a Espansione nome file nel manuale.
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.
*è 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).
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.)
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
onlydotatend.caso è una partita, sicuramente?
touch 'onlydotatend.' && echo *.*non lo restituisce
bashe dash. Che shell stai usando?
zshconfigurazione vanilla e funziona anche lì. Non capisco come onlydotatend.non possa essere una corrispondenza, esiste un'opzione di configurazione che lo fa?
*7.*, ottengo tutti i file il cui ultimo carattere prima dell'estensione è un7e*sa*, con , ottengo tutti i file che contengono la sottostringasaovunque 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).)