Respuestas:
*.*
sistemas Windows / DOS antiguosLa importancia aquí está más relacionada con Windows / DOS que con Unix / Linux. En viejos sistemas de Windows / DOS era un patrón 'comodín'. Se usaron patrones comodín para hacer coincidir los nombres de los archivos de manera similar a los globos Unix. El *.*
comodín se usaba comúnmente para coincidir con cualquier archivo.
Al igual que con un globo de Unix, *
coincidirá con cualquier secuencia de caracteres en un nombre de archivo, como tal *
por sí solo también coincidirá con cualquier archivo. Sin embargo, la razón por la *.*
que coincidirá con cualquier nombre de archivo también se debe a las diferencias en la forma en que funcionan estos comodines. De acuerdo con este artículo :
Cualquier carácter que no sea un punto que viene después de un asterisco no tiene ningún efecto, ya que el asterisco mueve el cursor a la posición 12, en cuyo punto nada cambia el estado de análisis excepto un punto, que borra las últimas tres posiciones y mueve el cursor.
Este comportamiento (algo extraño desde la perspectiva de Unix) significa que un punto que sigue a un en *
realidad no coincide con un punto, pero es solo una forma hack para permitirte agregar más caracteres al patrón. Esto significa que agregar otro *
coincidirá con cualquier cosa en estas últimas tres posiciones.
Esto tiene un poco más de sentido cuando considera que la sintaxis se usó en sistemas DOS y Windows anteriores a Windows 95, que requería 8.3 nombres de archivo . Estos nombres de archivo solo podían tener un punto y, como máximo, tres caracteres después del punto. La mayoría, si no todos los archivos en el sistema tendrían una extensión de tres caracteres (a pesar de que técnicamente se permitía una extensión más corta o ninguna), por lo que de alguna manera supongo que tenía sentido usar *.*
un archivo (al menos desde una perspectiva lógica de Windowsey deformada) )
*.*
conchas en UnixEn los shells de Unix, como otros han señalado, esto representa una 'expansión de nombre de ruta' o 'glob'. El *
no tiene ningún salto extraño al comportamiento final y, por lo tanto, no conduce a que los personajes que lo siguen sean ignorados. *.*
El patrón coincidirá con cualquier nombre de archivo que contenga un punto (excepto al principio). Definitivamente, esto no coincidirá con ningún archivo, ya que hay muchos archivos en un sistema Unix / Linux que no tienen una extensión (o de lo contrario contienen un punto, ya que esto también está permitido).
La razón para *.*
no hacer coincidir un punto al comienzo de los nombres de archivo en Unix es porque poner un punto al comienzo es cómo los archivos están 'ocultos' y los archivos ocultos se excluyen de los globos de forma predeterminada. Para hacerlos coincidir en un shell POSIX, se debe colocar un punto explícitamente al comienzo del patrón. En bash
la dotglob
opción de shell se puede configurar o la GLOBIGNORE
variable se puede configurar de manera apropiada, ¡pero esta es otra pregunta!
Está glob
en bash, a continuación he citado del manual de bash:
bash - GNU Bourne-Again SHell
*
Coincide con cualquier cadena, incluida la cadena nula. Cuando la opción de shell globstar está habilitada y
*
se usa en un contexto de expansión de nombre de ruta, dos adyacentes*s
utilizados como un solo patrón coincidirán con todos los archivos y cero o más directorios y subdirectorios. Si seguido de a/
, dos adyacentes*s
coincidirán solo con directorios y subdirectorios.
En este caso, *.*
haga coincidir los archivos que contengan un punto .
en su nombre.
Puedes ver más detalles aquí .
El asterisco *
es un glob
lenguaje de shell. Citando desde el lenguaje de comandos de Shell :
El asterisco (
'*'
) es un patrón que debe coincidir con cualquier cadena, incluida la cadena nula.
Sin embargo, no coincide con los nombres de archivo que comienzan con a .
menos que se establezca la opción de shell dotglob
.
Cuando lo usas *.*
, coincide con todo lo que:
.
.
Es posible que también desee consultar la Expansión del nombre de archivo en el manual.
Mucha gente que viene de Windows piensa que *.*
es para todos los archivos. En Windows, lo es. En UNIX, son todos los archivos que contienen al menos 1 punto en su nombre. *
por sí solo funciona bien en Windows (desde el principio hasta DOS); Sin embargo, los viejos libros de texto publicados *.*
y parece ser un hábito difícil de romper.
*
es un comodín utilizado por el shell para realizar la expansión del nombre de archivo , también conocido como "globbing". *
se expande a cualquier cosa, incluso a nada (por ejemplo, *.*
coincidirá file.
, etc.). El otro comodín común es ?
, que coincide con cualquier carácter individual.
No confunda la función de estos comodines con el uso de los mismos caracteres en expresiones regulares (como las que se usan con grep).
Eso es star-dot-star , al menos, en el mundo DOS (y más tarde, por supuesto, Windows). En DOS, el punto .
tiene un significado mágico especial, porque los nombres de archivo son una base de ocho caracteres (más tarde extendida, pero sigamos siendo de la vieja escuela) y una extensión de tres caracteres (que definió el tipo de archivo). En Unix, el tipo de archivo generalmente se define por los primeros dos bytes del archivo (u otra magia), y la extensión es informativa pero no tiene mucho significado. Excepto cuando todo esto se ha vuelto borroso.
Entonces, en Unix, no hay un significado especial. El asterisco es un carácter "global" en los shells de Unix y es comodín para cualquier número de caracteres (incluido cero). ?
es otro personaje común común, que coincide exactamente con uno de cualquier personaje
*.*
coincide con cualquier nombre de archivo que contenga al menos uno .
. No tiene un nombre especial ni ningún significado más que *a*
o *_*
. Y *.?
coincidiría con cualquier archivo con un punto y exactamente un carácter después de ese punto. También hay algunos patrones de globbing extendidos más complicados: consulte la página de manual de su shell.
El "New Hacker's Dictionary" (una expansión del antiguo "archivo de jerga" del MIT) señala que "estrella" es el nombre más común para el *
símbolo (seguido de splat
), y creo que eso sigue siendo cierto en la práctica, y .
definitivamente es común " punto ", por lo tanto, aunque no tiene ningún significado especial intrínseco como símbolo conglomerado, la secuencia todavía se llama razonablemente estrella-punto-estrella en Unix. (Es menos útil).
Aquí en realidad hay 2 símbolos, asterisco *
y punto .
. Los proyectiles normalmente solo interpretan el asterisco como cualquier personaje, pero en la expresión regular significaría un globo codicioso. En este caso, coincidiría con todo lo que no termina o comienza con un punto, pero contiene al menos uno:
somefile.dot # match
.dot.between.words. # match
.onlydotatstart # don't match
onlydotatend. # match
.startandenddot. # don't match
onlydotatend.
caso es un partido, ¿no?
touch 'onlydotatend.' && echo *.*
no lo devuelve
bash
y dash
. ¿Qué caparazón estás usando?
zsh
configuración vainilla y funciona allí también. No entiendo cómo onlydotatend.
no puede ser una coincidencia, ¿hay una opción de configuración que haga esto?
*7.*
, obtengo todos los archivos cuyo último carácter antes de la extensión es a7
, y con*sa*
, obtengo todos los archivos que contienen la subcadenasa
en cualquier lugar del nombre de archivo, y así sucesivamente. (De acuerdo con ello, el artículo que citas se titula Cómo hicieron comodines funcionan en MS-DOS ? (El subrayado es de mi mismo).)