glob (programación)

Patterns used in computer programming

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/.txttextfiles**.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/.txtshorttextfiles??.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.

Origen

Una captura de pantalla de la página de referencia original de Unix de 1971 para glob– el propietario es dmr, abreviatura de Dennis Ritchie .

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.

Sintaxis

Los comodines más comunes son *, ?, y […].

ComodínDescripciónEjemploPartidosNo coincide
*coincide con cualquier número de caracteres, incluido ningunoLaw*Law, Laws, oLawyerGrokLaw, La, oaw
*Law*Law, GrokLaw, o Lawyer.La, oaw
?coincide con cualquier caracter individual?atCat, cat, Batobatat
[abc]coincide con un carácter dado entre paréntesis[CB]atCatoBatcat, batoCBat
[a-z]coincide con un carácter del rango (dependiente de la configuración regional) dado entre paréntesisLetter[0-9]Letter0, Letter1, Letter2hastaLetter9Letters, LetteroLetter10

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]

Similar a Unix

En sistemas tipo Unix* , ?se define como se indica más arriba, mientras que […]tiene dos significados adicionales: [6] [7]

ComodínDescripciónEjemploPartidosNo coincide
[!abc]coincide con un carácter que no está entre paréntesis[!C]atBat, bat, ocatCat
[!a-z]coincide con un carácter que no está en el rango dado entre paréntesisLetter[!3-5]Letter1, Letter2, Letter6hasta Letter9y Letterxetc.Letter3, Letter4, Letter5oLetterxx

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 caseen 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]

  • Globbing extendido (extglob): permite utilizar otros operadores de coincidencia de patrones para hacer coincidir múltiples ocurrencias de un patrón entre paréntesis, lo que esencialmente proporciona la asterisco kleene y la alternancia que faltan para describir lenguajes regulares. Se puede habilitar configurando la extglobopció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 recursivamente cualquier número de capas de directorios no ocultos. [10] También es compatible con las bibliotecas de JavaScript y glob de Python .

Windows y DOS

El dircomando con un patrón glob en IBM PC DOS 1.0.

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:

  • 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, 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]

  • 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 de __getmainargs, la función que opera bajo el capó, en su CRT principal.
  • El expansor de línea de comandos de Cygwin y MSYS 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.

SQL

El operador SQL LIKE tiene un equivalente a ?y *pero no […].

Comodín comúnComodín SQLDescripció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 LIKEoperador, 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 LIKEoperador para permitir un lenguaje de coincidencia de patrones más rico, incorporando rangos de caracteres ( […]), su negación y elementos de expresiones regulares. [15]

En comparación con las expresiones regulares

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únExpresión regular equivalente
?.
*.*

Los globs intentan coincidir con la cadena completa (por ejemplo, S*.DOCcoincide 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.

Implementando como expresiones regulares

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]

Otras implementaciones

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:

  • C# tiene múltiples bibliotecas disponibles a través de NuGet, como Glob. [18] o DotNet.Glob. [19]
  • D tiene una globMatchfunción en el std.pathmódulo. [20]
  • JavaScript tiene una biblioteca llamada 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]
  • Go tiene una Globfunción en el filepathpaquete. [23]
  • Java tiene una Filesclase que contiene métodos que operan sobre patrones glob. [24]
  • Haskell tiene un Globpaquete 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]
  • Perl tiene tanto una globfunció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>.
  • PHP tiene una globfunción. [27]
  • Python tiene un globmódulo en la biblioteca estándar que realiza la coincidencia de patrones comodín en nombres de archivos, [28] y un fnmatchmó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 globrutina para BSD Unix en 1986. [29] Hubo implementaciones previas de glob, por ejemplo, en los programas ex y ftp en versiones anteriores de BSD.
  • Ruby tiene un globmétodo para la Dirclase que realiza la coincidencia de patrones comodín en los nombres de archivos. [30] Varias bibliotecas como Rant y Rake proporcionan una FileListclase que tiene un método glob o usan el método FileList.[]de manera idéntica.
  • Rust tiene múltiples bibliotecas que pueden coincidir con patrones glob. [31]
  • SQLite tiene una GLOBfunción.
  • Tcl contiene una función de globbing. [32]

Véase también

Referencias

  1. ^ "Sección 'Miscelánea' 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 .
  2. ^ McIlroy, MD (1987). Un lector de Unix para investigación: extractos anotados del Manual del programador, 1971–1986 (PDF) (Informe técnico). CSTR. Bell Labs. 139.
  3. ^ ab fnmatch(3) –  Manual del programador de Linux – Funciones de la biblioteca
  4. ^ glob(3)  –  Manual del programador de Linux – Funciones de la biblioteca
  5. ^ https://www.gnu.org/software/bash/manual/bash.html#Pattern-Matching Archivado el 15 de marzo de 2018 en Wayback Machine Manual de referencia de Bash
  6. ^ ab "Especificaciones básicas de The Open Group, número 7, IEEE Std 1003.1, edición 2013, 2.13. Notación de coincidencia de patrones". Archivado desde el original el 27 de abril de 2014. Consultado el 26 de octubre de 2015 .
  7. ^ ab "Manual del programador de Linux, GLOB(7)". Archivado desde el original el 2015-10-31 . Consultado el 2015-10-26 .
  8. ^ La "Guía avanzada de scripts en Bash, Capítulo 19.2: Globbing" (Mendel Cooper, 2003) tiene un conjunto conciso de ejemplos de patrones de globbing de nombres de archivo.
  9. ^ "Bash globs". Base de conocimiento de bash de Greg . Archivado desde el original el 18 de noviembre de 2019. Consultado el 25 de noviembre de 2019 .
  10. ^ ab "Coincidencia de patrones". Manual de referencia de Bash . Archivado desde el original el 2016-02-11 . Consultado el 2016-01-11 .
  11. ^ "Compatibilidad de caracteres comodín en parámetros de cmdlet". Microsoft . Microsoft Developer Network.
  12. ^ "Expansión de comodines". Microsoft Developer Network. 2013. Archivado desde el original el 22 de agosto de 2014. Consultado el 16 de octubre de 2013 .
  13. ^ "Expansión de comodines". docs.microsoft.com . 2022-02-08.
  14. ^ Caracteres comodín en Windows Archivado el 24 de diciembre de 2019 en Wayback Machine . Blog de desarrollo de MSDN.
  15. ^ "LIKE (Transact-SQL)". 23 de mayo de 2023. Archivado desde el original el 2 de agosto de 2017. Consultado el 1 de agosto de 2017 .
  16. ^ Hopcroft, John E.; Motwani, Rajeev; Ullman, Jeffrey D. (2000). Introducción a la teoría de autómatas, lenguajes y computación (2.ª ed.). Addison-Wesley.
  17. ^ ab "Lib/fnmatch.py". Python. 20 de enero de 2021. Archivado desde el original el 10 de noviembre de 2021. Consultado el 10 de noviembre de 2021 .
  18. ^ "kthompson/glob". GitHub . Archivado desde el original el 26 de octubre de 2020 . Consultado el 6 de noviembre de 2020 .
  19. ^ "dazinator/dotnet.glob". GitHub . Archivado desde el original el 2022-06-22 . Consultado el 2022-06-22 .
  20. ^ "std.path - Lenguaje de programación D - Digital Mars". dlang.org. Archivado desde el original el 8 de septiembre de 2014. Consultado el 8 de septiembre de 2014 .
  21. ^ "isaacs/minimatch". GitHub . Archivado desde el original el 28 de julio de 2016 . Consultado el 10 de agosto de 2016 .
  22. ^ "jonschlinkert/micromatch". GitHub . Archivado desde el original el 2016-02-11 . Consultado el 2017-04-04 .
  23. ^ "Ruta de archivo del paquete - El lenguaje de programación Go". Golang.org. Archivado desde el original el 25 de mayo de 2011. Consultado el 11 de mayo de 2011 .
  24. ^ "Operaciones con archivos". Oracle. Archivado desde el original el 20 de septiembre de 2013. Consultado el 16 de diciembre de 2013 .
  25. ^ "Glob-0.7.4: Biblioteca de globbing". Archivado desde el original el 8 de mayo de 2014. Consultado el 7 de mayo de 2014 .
  26. ^ "File::Glob - Extensión de Perl para la rutina glob de BSD". perldoc.perl.org . Consultado el 11 de mayo de 2011 .
  27. ^ "glob - Manual". PHP. 2011-05-06. Archivado desde el original el 2017-11-13 . Consultado el 2011-05-11 .
  28. ^ "10.7. glob — Expansión de patrones de nombres de ruta al estilo Unix — Documentación de Python v2.7.1". Docs.python.org. Archivado desde el original el 2011-05-16 . Consultado el 2011-05-11 .
  29. ^ "Rutina de biblioteca 'Globbing'". Archivado desde el original el 19 de diciembre de 2007. Consultado el 11 de mayo de 2011 .
  30. ^ "Clase: Dir". Ruby-doc.org. Archivado desde el original el 15 de mayo de 2011. Consultado el 11 de mayo de 2011 .
  31. ^ "#glob - Lib.rs". lib.rs . Archivado desde el original el 2021-11-12 . Consultado el 2021-11-12 .
  32. ^ "Página del manual de TCL glob". Archivado desde el original el 8 de diciembre de 2011. Consultado el 16 de noviembre de 2011 .
Retrieved from "https://en.wikipedia.org/w/index.php?title=Glob_(programming)&oldid=1247820436"