En programación de computadoras , los patrones globales especifican conjuntos de nombres de archivos con caracteres comodín . Por ejemplo, el comando de shell Unix Bashmv *.txt textfiles/
mueve ( mv
) todos los archivos con nombres que terminan en .txt
desde el directorio actual al directorio textfiles
. Aquí, *
hay un comodín que representa "cualquier cadena de caracteres" y *.txt
es un patrón global. El otro comodín común es el signo de interrogación ( ?
), que representa un carácter. Por ejemplo, mv ?.txt shorttextfiles/
moverá todos los archivos nombrados con un solo carácter seguido de .txt
desde el directorio actual al directorio shorttextfiles
, mientras??.txt
coincidiría con todos los archivos cuyo nombre consta de 2 caracteres seguidos de .txt
.
Además de hacer coincidir nombres de archivo, los globs también se utilizan ampliamente para hacer coincidir cadenas arbitrarias ( coincidencia de comodines ). En esta capacidad, una interfaz común es fnmatch
.
Origen
El comando glob, abreviatura de global , se origina 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) se basaron en un programa separado para expandir los caracteres comodín en argumentos sin comillas a un comando: / etc / glob . Ese programa realizó la expansión y proporcionó la lista ampliada de rutas de archivo al comando para su ejecución.
Glob fue originalmente escrito en el lenguaje de programación B . Fue la primera pieza de software Unix de línea principal que se desarrolló en un lenguaje de programación de alto nivel . [2] Más tarde, esta funcionalidad se proporciona como un C función de biblioteca , glob()
, utilizado por programas como el shell . Por lo general, se define en función de una función nombrada fnmatch()
, que prueba si una cadena coincide con un patrón determinado; el programa que usa esta función puede iterar a través de una serie de cadenas (generalmente nombres de archivo) para determinar cuáles coinciden. Ambas funciones forman 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 de comodines), una biblioteca simple para hacer coincidir cadenas con globs de Bourne Shell.
Tradicionalmente, los globs no coinciden con los archivos ocultos en forma de dotfiles de Unix ; para hacerlos coincidir, el patrón debe comenzar explícitamente .
. Por ejemplo, *
coincide con todos los archivos visibles mientras que .*
coincide con todos los archivos ocultos.
Sintaxis
Los más comunes son los comodines *
, ?
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 , o aw | ||
? | coincide con cualquier carácter | ?at | Cat , cat , Bat Obat | at |
[abc] | coincide con un carácter dado en el corchete | [CB]at | Cat o Bat | cat , bat oCBat |
[a-z] | coincide con un carácter del rango (dependiente de la configuración regional) dado en el corchete | 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 eludir esto. [5]
Tipo Unix
En sistemas similares a Unix *
, ?
se define como anteriormente, 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 pertenece al rango dado en el corchete | 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 clasificación para caracteres difíciles de escribir. Están definidos para coincidir con los corchetes en las expresiones regulares POSIX. [6] [7]
El globbing de Unix es manejado por el shell según la tradición POSIX. Globbing se proporciona en los nombres de archivo en la línea de comandos y en los scripts de shell . [8] La case
declaración exigida por POSIX en shells proporciona una coincidencia de patrones utilizando patrones globales.
Algunos shells (como el shell C y Bash ) admiten una sintaxis adicional conocida como alternancia o expansión de llaves . Debido a que no forma parte de la sintaxis global, no se proporciona en case
. Solo se expande en la línea de comando antes del globbing.
El shell Bash también admite las siguientes extensiones: [9]
- Globbing extendido (extglob): permite utilizar otros operadores de coincidencia de patrones para hacer coincidir múltiples ocurrencias de un patrón entre paréntesis, proporcionando esencialmente la estrella de kleene que falta y la alternancia para describir los lenguajes regulares. Se puede habilitar configurando la
extglob
opción de shell. Esta opción proviene de ksh93. [10] GNU fnmatch y glob tienen una extensión idéntica. [3] - globstar: permite
**
por sí solo, como componente de nombre, hacer coincidir de forma recursiva cualquier número de capas de directorios no ocultos. [10] También es compatible con las bibliotecas JS y el glob de Python.
Windows y DOS
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, después de DOS, no realizan tradicionalmente ninguna expansión global en los argumentos que se pasan a programas externos. Los shells pueden usar una expansión para sus propios comandos integrados:
- Windows PowerShell tiene toda la sintaxis común definida como se indicó anteriormente sin ninguna adición. [11]
- COMMAND.COM y cmd.exe tienen la mayor parte de la sintaxis común con algunas limitaciones: no existe
[…]
y para COMMAND.COM*
solo puede aparecer al final del patrón. No puede aparecer en medio de un patrón, excepto inmediatamente antes del punto separador de extensión de 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 glob comunes incluyen: [12]
- El expansor de línea de comandos de Microsoft C Runtime (msvcrt), que solo admite
?
y*
. [13] Tanto ReactOS (crt / misc / getargs.c) como Wine (msvcrt / data.c) contienen una implementación de código abierto compatible__getmainargs
, la función que opera bajo el capó, en su CRT central. - El expansor de línea de comandos Cygwin y MSYS
dcrt0.cc
, que usa laglob()
rutina de estilo Unix debajo del capó, después de dividir los argumentos.
La mayoría de las otras partes de Windows, incluido el Servicio de Index Server, utilizan el estilo de comodines de MS-DOS que se encuentra en CMD. Una reliquia de la era del nombre 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 usando tres caracteres comodín extra, <>"
. En el extremo de la API de Windows, el equivalente de glob () es FindFirstFile y fnmatch () corresponde a su subyacente RtlIsNameInExpression . [14] (Otro análogo de fnmatch es PathMatchSpec .) Ambos expansores msvcrt de código abierto usan FindFirstFile , por lo que las peculiaridades del nombre de archivo 8.3 también se aplicarán en ellos.
SQL
El SQL LIKE
operador tiene un equivalente a ?
y *
pero no […]
.
Comodín común | Comodín SQL | Descripción |
---|---|---|
? | _ | coincide con cualquier carácter |
* | % | coincide con cualquier número de caracteres, incluido ninguno |
SQL estándar usa una sintaxis similar a glob para la coincidencia de cadenas simple en su LIKE
operador, aunque el término "glob" no se usa 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 extendido 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]
Comparado con expresiones regulares
Los globos 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 lenguajes regulares sobre cualquier alfabeto finito dado. [dieciséis]
Comodín común | Expresión regular equivalente |
---|---|
? | . |
* | .* |
Los Globs intentan hacer coincidir la cadena completa (por ejemplo, S*.DOC
coincide con S.DOC y SA.DOC, pero no con POST.DOC o SURREY.DOCKS), mientras que, según los detalles de implementación, las expresiones regulares pueden coincidir con una subcadena.
Implementar como expresiones regulares
La implementación de configuración automática del proxy de Mozilla original , que proporciona una función de coincidencia global en cadenas, utiliza una implementación de reemplazo como RegExp como se indicó anteriormente. La sintaxis de corchetes está cubierta por expresiones regulares en un ejemplo de este tipo.
Fnmatch de Python utiliza un procedimiento más elaborado para transformar el patrón en una expresión regular. [17]
Otras implementaciones
Más allá de su uso en shells, los patrones globs también encuentran uso 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 cadenas coincidentes se encuentran en los siguientes lenguajes de programación:
- C # tiene una biblioteca llamada
Glob
que se puede instalar usando NuGet . [18] - D tiene una
globMatch
función en elstd.path
módulo. [19] - JavaScript tiene una biblioteca llamada
minimatch
que es utilizada internamente por npm , ymicromatch
una implementación de globbing supuestamente más optimizada, precisa y segura utilizada por babel e yarn. [20] [21] - Go tiene una
Glob
función en elfilepath
paquete. [22] - Java tiene una
Files
clase que contiene métodos que operan en patrones globales. [23] - Haskell tiene un
Glob
paquete con el módulo principalSystem.FilePath.Glob
. La sintaxis del patrón se basa en un subconjunto de Zsh . Intenta optimizar el patrón dado y debería ser notablemente más rápido que un ingenuo comparador carácter por carácter. [24] - Perl tiene una
glob
función (como se explica en el libro Programming Perl de Larry Wall ) y una extensión Glob que imita la rutina glob BSD. [25] corchetes angulares de Perl se pueden utilizar para glob así: .<*.log>
- PHP tiene una
glob
función. [26] - Python tiene un
glob
módulo en la biblioteca estándar que realiza la coincidencia de patrones comodín en nombres de archivo, [27] y unfnmatch
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 unaglob
rutina para BSD Unix en 1986. [28] Hubo implementaciones previas deglob
, por ejemplo, en los programas ex y ftp en versiones anteriores de BSD. - Ruby tiene un
glob
método para laDir
clase que realiza una coincidencia de patrones comodín en los nombres de archivo. [29] Varias bibliotecas como Rant y Rake proporcionan unaFileList
clase que tiene un método glob o usan el método de maneraFileList.[]
idéntica. - SQLite tiene una
GLOB
función. - Tcl contiene una función de globbing. [30]
Ver también
- Expresión regular
- Carácter comodín
- Coincidencia de comodines
Referencias
- ^ "Sección 'Varios' del manual de Unix de la primera edición (PDF)" (PDF) . Archivado desde el original (PDF) el 29 de agosto de 2000 . Consultado el 11 de mayo de 2011 .
- ^ McIlroy, MD (1987). Un lector de investigación Unix: extractos comentados del Manual del programador, 1971–1986 (PDF) (Informe técnico). CSTR. Bell Labs. 139.
- ^ a b - Manual del programador de Linux - Funciones de biblioteca
- ^ - Manual del programador de Linux - Funciones de biblioteca
- ^ [ https://www.gnu.org/software/bash/manual/bash.html#Pattern-Matching Bash Manual de referencia
- ^ a b "Las especificaciones de base de Open Group Issue 7 IEEE Std 1003.1, 2013 Edition, 2.13. Notación de coincidencia de patrones" .
- ^ a b "Manual del programador de Linux, GLOB (7)" .
- ^ La "Advanced Bash-Scripting Guide, Capítulo 19.2: Globbing" (Mendel Cooper, 2003) tiene un conjunto conciso de ejemplos de patrones de globbing de nombres de archivo.
- ^ "Bash globs" . base de conocimientos de bash de greg . Consultado el 25 de noviembre de 2019 .
- ^ a b "Coincidencia de patrones" . Manual de referencia de Bash .
- ^ "Compatibilidad con caracteres comodín en parámetros de cmdlet" . Microsoft . Red de desarrolladores de Microsoft.
- ^ "Expansión de comodines" . Red de desarrolladores de Microsoft. 2013.
- ^ "Expansión de comodines" . docs.microsoft.com .
- ^ Comodines en Windows . Devblog de MSDN.
- ^ "ME GUSTA (Transact-SQL)" .
- ^ Hopcroft, John E .; Motwani, Rajeev; Ullman, Jeffrey D. (2000). Introducción a la teoría, los lenguajes y la computación de los autómatas (2ª ed.). Addison-Wesley.
- ^ a b "Lib / fnmatch.py" . Pitón. 2019-11-24 . Consultado el 24 de noviembre de 2019 .
- ^ "kthompson / glob" . GitHub . Consultado el 6 de noviembre de 2020 .
- ^ "std.path - Lenguaje de programación D - Digital Mars" . dlang.org . Consultado el 8 de septiembre de 2014 .
- ^ "isaacs / minimatch" . GitHub . Consultado el 10 de agosto de 2016 .
- ^ "jonschlinkert / micromatch" . GitHub . Consultado el 4 de abril de 2017 .
- ^ "Ruta de archivo del paquete - El lenguaje de programación Go" . Golang.org . Consultado el 11 de mayo de 2011 .
- ^ "Operaciones de archivo" . Oracle . Consultado el 16 de diciembre de 2013 .
- ^ "Glob-0.7.4: biblioteca globbing" . Consultado el 7 de mayo de 2014 .
- ^ "File :: Glob - Extensión de Perl para la rutina de BSD glob" . perldoc.perl.org . Consultado el 11 de mayo de 2011 .
- ^ "glob - Manual" . PHP. 2011-05-06 . Consultado el 11 de mayo de 2011 .
- ^ "10.7. Glob - Expansión de patrón de nombre de ruta de estilo Unix - Documentación de Python v2.7.1" . Docs.python.org . Consultado el 11 de mayo de 2011 .
- ^ " Rutina de la biblioteca ' Globbing'" . Archivado desde el original el 19 de diciembre de 2007 . Consultado el 11 de mayo de 2011 .
- ^ "Clase: Dir" . Ruby-doc.org . Consultado el 11 de mayo de 2011 .
- ^ "Página de manual de TCL glob" . Consultado el 16 de noviembre de 2011 .