¿Cómo se llama el símbolo *. *?

Respuestas:

20

Interpretación de *.*sistemas Windows / DOS antiguos

La 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) )

Interpretación de *.*conchas en Unix

En 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 bashla dotglobopción de shell se puede configurar o la GLOBIGNOREvariable se puede configurar de manera apropiada, ¡pero esta es otra pregunta!

Graeme
fuente
1
Cabe señalar que las versiones actuales de Windows parecen comportarse de manera más lógica. En particular, "Cualquier carácter que no sea un punto que viene después de un asterisco no tiene efecto" ya no es cierto; al menos al filtrar archivos en un cuadro de diálogo estándar Abrir archivo en Windows 7 por el patrón *7.*, obtengo todos los archivos cuyo último carácter antes de la extensión es a 7, y con *sa*, obtengo todos los archivos que contienen la subcadena saen 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).)
O Mapper
1
@ORMapper, actualizó los encabezados para reflejar esto. Este comportamiento es anterior a Windows 95, que está en la respuesta (aunque el encabezado era engañoso).
Graeme
11

Está globen 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 *sutilizados 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 *scoincidirá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í .

Cuonglm
fuente
8

El asterisco *es un globlenguaje 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:

  • no comienza con un .
  • contiene al menos uno .

Es posible que también desee consultar la Expansión del nombre de archivo en el manual.

devnull
fuente
6

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.

Joshua
fuente
4

*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).

encerrada dorada
fuente
3

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).

mattdm
fuente
Esto puede sonar extraño, pero gracias por mencionar "star dot star", ¡es lo que hizo que esta página sea googleable!
Score_Under
3

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
Braiam
fuente
1
Tu onlydotatend.caso es un partido, ¿no?
Graeme
@Graeme no. touch 'onlydotatend.' && echo *.*no lo devuelve
Braiam
1
Lo hace por mi! En ambos bashy dash. ¿Qué caparazón estás usando?
Graeme
@Graeme zsh, y tienes razón, bash no.
Braiam
Acabo de probar esto en una zshconfiguració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?
Graeme