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 bash
l' dotglob
opzione di shell può essere impostata o la GLOBIGNORE
variabile può essere impostato in modo appropriato, ma questa è un'altra questione!
È glob
in 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*s
utilizzati come un singolo modello corrisponderanno a tutti i file e zero o più directory e sottodirectory. Se seguito da un/
, due adiacenti*s
corrisponderanno 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 glob
linguaggio 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 dotglob
sia 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
bash
e dash
. Che shell stai usando?
zsh
configurazione 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 è un7
e*sa*
, con , ottengo tutti i file che contengono la sottostringasa
ovunque 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).)