En programación informática , los patrones glob ( / ɡ l ɒ b / ) especifican conjuntos de nombres de archivos con caracteres comodín . Por ejemplo, el comando de shell Bash de Unix mueve todos los archivos con nombres que terminan en desde el directorio actual al directorio . Aquí, es un comodín y es un patrón glob. El comodín representa "cualquier cadena de cualquier longitud, incluidos los caracteres vacíos, pero excluidos los separadores de ruta ( en Unix y en Windows)".mv *.txt textfiles/
.txt
textfiles
*
*.txt
*
/
\
El otro comodín común es el signo de interrogación ( ?
), que representa un carácter. Por ejemplo, moverá todos los archivos nombrados con un solo carácter seguido de desde el directorio actual al directorio , mientras que coincidirá con todos los archivos cuyo nombre consta de 2 caracteres seguidos de .mv ?.txt shorttextfiles/
.txt
shorttextfiles
??.txt
.txt
Además de para hacer coincidir nombres de archivos, los globs también se usan ampliamente para hacer coincidir cadenas arbitrarias ( coincidencia de comodines ). En esta capacidad, una interfaz común es fnmatch
.
El comando glob, abreviatura de global , tiene su origen en las primeras versiones de Unix de Bell Labs . [1] Los intérpretes de comandos de las primeras versiones de Unix (1.ª a 6.ª ediciones, 1969-1975) dependían de un programa independiente para expandir los caracteres comodín en los argumentos sin comillas de un comando: /etc/glob . Ese programa realizaba la expansión y proporcionaba la lista ampliada de rutas de archivo al comando para su ejecución.
Glob se escribió originalmente en el lenguaje de programación B. Fue la primera pieza de software principal de Unix que se desarrolló en un lenguaje de programación de alto nivel . [2] Más tarde, esta funcionalidad se proporcionó como una función de biblioteca C , glob()
, utilizada por programas como el shell . Por lo general, se define en función de una función llamada fnmatch()
, que prueba si una cadena coincide con un patrón dado: el programa que usa esta función puede iterar a través de una serie de cadenas (generalmente nombres de archivos) para determinar cuáles coinciden. Ambas funciones son parte de POSIX : las funciones definidas en POSIX.1 desde 2001 y la sintaxis definida en POSIX.2. [3] [4] La idea de definir una función de coincidencia separada comenzó con wildmat (coincidencia con comodín), una biblioteca simple para hacer coincidir cadenas con globs de Bourne Shell.
Tradicionalmente, los globs no coinciden con archivos ocultos en forma de archivos de puntos de Unix ; para que coincidan con ellos, el patrón debe comenzar explícitamente con .
. Por ejemplo, *
coincide con todos los archivos visibles mientras que .*
coincide con todos los archivos ocultos.
Los comodines más comunes son *
, ?
, y […]
.
Comodín | Descripción | Ejemplo | Partidos | No coincide |
---|---|---|---|---|
* | coincide con cualquier número de caracteres, incluido ninguno | Law* | Law , Laws , oLawyer | GrokLaw , La , oaw |
*Law* | Law , GrokLaw , o Lawyer . | La , oaw | ||
? | coincide con cualquier caracter individual | ?at | Cat , cat , Bat obat | at |
[abc] | coincide con un carácter dado entre paréntesis | [CB]at | Cat oBat | cat , bat oCBat |
[a-z] | coincide con un carácter del rango (dependiente de la configuración regional) dado entre paréntesis | Letter[0-9] | Letter0 , Letter1 , Letter2 hastaLetter9 | Letters , Letter oLetter10 |
Normalmente, el carácter separador de ruta ( /
en Linux/Unix, MacOS, etc. o \
en Windows) nunca coincidirá. Algunos shells, como Bash , tienen una funcionalidad que permite a los usuarios evitar esto. [5]
En sistemas tipo Unix*
, ?
se define como se indica más arriba, mientras que […]
tiene dos significados adicionales: [6] [7]
Comodín | Descripción | Ejemplo | Partidos | No coincide |
---|---|---|---|---|
[!abc] | coincide con un carácter que no está entre paréntesis | [!C]at | Bat , bat , ocat | Cat |
[!a-z] | coincide con un carácter que no está en el rango dado entre paréntesis | Letter[!3-5] | Letter1 , Letter2 , Letter6 hasta Letter9 y Letterx etc. | Letter3 , Letter4 , Letter5 oLetterxx |
Los rangos también pueden incluir clases de caracteres predefinidas, clases de equivalencia para caracteres acentuados y símbolos de intercalación para caracteres difíciles de escribir. Están definidos para coincidir con los corchetes en las expresiones regulares POSIX. [6] [7]
El shell gestiona el globbing de Unix según la tradición POSIX. El globbing se proporciona en los nombres de archivo en la línea de comandos y en los scripts del shell . [8] La declaración obligatoria de POSIX case
en los shells proporciona coincidencia de patrones utilizando patrones glob.
Algunos shells (como C shell y Bash ) admiten una sintaxis adicional conocida como alternancia o expansión de llaves . Como no es parte de la sintaxis glob, no se proporciona en case
. Solo se expande en la línea de comandos antes de la expansión glob.
El shell Bash también admite las siguientes extensiones: [9]
extglob
opción de shell. Esta opción proviene de ksh93. [10] GNU fnmatch y glob tienen una extensión idéntica. [3]**
por sí solo, como componente de nombre, hacer coincidir recursivamente cualquier número de capas de directorios no ocultos. [10] También es compatible con las bibliotecas de JavaScript y glob de Python .El DOS original era un clon de CP/M diseñado para funcionar en los procesadores 8088 y 8086 de Intel . Los shells de Windows, siguiendo el DOS, no suelen realizar ninguna expansión global en los argumentos que se pasan a programas externos. Los shells pueden utilizar una expansión para sus propios comandos integrados:
[…]
y para COMMAND.COM, pero *
solo puede aparecer al final del patrón. No puede aparecer en el medio de un patrón, excepto inmediatamente antes del punto separador de la extensión del nombre de archivo .Los programas de Windows y DOS reciben una cadena de línea de comandos larga en lugar de parámetros de estilo argv, y es su responsabilidad realizar cualquier división, comillas o expansión global. Técnicamente, no existe una forma fija de describir los comodines en los programas, ya que son libres de hacer lo que deseen. Dos expansores globales comunes incluyen: [12]
?
y *
. [13] Tanto ReactOS (crt/misc/getargs.c) como Wine (msvcrt/data.c) contienen una implementación de código abierto compatible de __getmainargs
, la función que opera bajo el capó, en su CRT principal.dcrt0.cc
, que utiliza la rutina de estilo Unix glob()
de manera interna, después de dividir los argumentos.La mayoría de las demás partes de Windows, incluido el Servicio de indexación, utilizan el estilo MS-DOS de comodines que se encuentra en CMD. Una reliquia de la era de los nombres de archivo 8.3, esta sintaxis presta especial atención a los puntos en el patrón y el texto (nombre de archivo). Internamente, esto se hace utilizando tres caracteres comodín adicionales, <>"
. En el extremo de la API de Windows, el equivalente de glob() es FindFirstFile y fnmatch() corresponde a su RtlIsNameInExpression subyacente . [14] (Otro análogo de fnmatch es PathMatchSpec ). Ambos expansores de código abierto msvcrt utilizan FindFirstFile , por lo que las peculiaridades de los nombres de archivo 8.3 también se aplicarán en ellos.
El operador SQL LIKE
tiene un equivalente a ?
y *
pero no […]
.
Comodín común | Comodín SQL | Descripción |
---|---|---|
? | _ | coincide con cualquier caracter individual |
* | % | coincide con cualquier número de caracteres, incluido ninguno |
El SQL estándar utiliza una sintaxis similar a la de glob para la coincidencia de cadenas simples en su LIKE
operador, aunque el término "glob" no se utiliza generalmente en la comunidad SQL. El signo de porcentaje ( %
) coincide con cero o más caracteres y el guión bajo ( _
) coincide exactamente con uno.
Muchas implementaciones de SQL han ampliado el LIKE
operador para permitir un lenguaje de coincidencia de patrones más rico, incorporando rangos de caracteres ( […]
), su negación y elementos de expresiones regulares. [15]
Los globs no incluyen la sintaxis de la estrella de Kleene , que permite múltiples repeticiones de la parte anterior de la expresión; por lo tanto, no se consideran expresiones regulares , que pueden describir el conjunto completo de idiomas regulares sobre cualquier alfabeto finito dado. [16]
Comodín común | Expresión regular equivalente |
---|---|
? | . |
* | .* |
Los globs intentan coincidir con la cadena completa (por ejemplo, S*.DOC
coincide con S.DOC y SA.DOC, pero no con POST.DOC o SURREY.DOCKS), mientras que, dependiendo de los detalles de implementación, las expresiones regulares pueden coincidir con una subcadena.
La implementación original de configuración automática del proxy de Mozilla , que proporciona una función de coincidencia global en cadenas, utiliza una implementación de reemplazo como expresión regular como se indica anteriormente. En este ejemplo, la sintaxis de corchetes está cubierta por expresiones regulares.
La función fnmatch de Python utiliza un procedimiento más elaborado para transformar el patrón en una expresión regular. [17]
Además de sus usos en shells, los patrones globs también se utilizan en una variedad de lenguajes de programación, principalmente para procesar la entrada humana. Una interfaz de estilo glob para devolver archivos o una interfaz de estilo fnmatch para hacer coincidir cadenas se encuentran en los siguientes lenguajes de programación:
Glob
. [18] o DotNet.Glob
. [19]globMatch
función en el std.path
módulo. [20]minimatch
, que es utilizada internamente por npm , y micromatch
, una implementación de globbing supuestamente más optimizada, precisa y segura utilizada por Babel y yarn. [21] [22]Glob
función en el filepath
paquete. [23]Files
clase que contiene métodos que operan sobre patrones glob. [24]Glob
paquete con el módulo principal System.FilePath.Glob
. La sintaxis de patrones se basa en un subconjunto de Zsh . Intenta optimizar el patrón dado y debería ser notablemente más rápido que un comparador ingenuo carácter por carácter. [25]glob
función (como se analiza en el libro de Larry Wall , Programming Perl ) como una extensión Glob que imita la rutina glob de BSD. [26] Los corchetes angulares de Perl también se pueden usar para glob: <*.log>
.glob
función. [27]glob
módulo en la biblioteca estándar que realiza la coincidencia de patrones comodín en nombres de archivos, [28] y un fnmatch
módulo con funciones para hacer coincidir cadenas o filtrar listas basadas en estos mismos patrones comodín. [17] Guido van Rossum , autor del lenguaje de programación Python, escribió y contribuyó con una glob
rutina para BSD Unix en 1986. [29] Hubo implementaciones previas de glob
, por ejemplo, en los programas ex y ftp en versiones anteriores de BSD.glob
método para la Dir
clase que realiza la coincidencia de patrones comodín en los nombres de archivos. [30] Varias bibliotecas como Rant y Rake proporcionan una FileList
clase que tiene un método glob o usan el método FileList.[]
de manera idéntica.GLOB
función.