Articulo de referencia

glob (programación)

Una captura de pantalla de la página de referencia original de Unix de 1971 para glob – el propietario es dmr , abreviatura de Dennis MacAlistair Ritchie . glob() ( / ɡ l ɒ b / ...

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

glob() ( / ɡ l ɒ b / ) es unafunción POSIX C para la expansión de patrones , que es el uso arquetípico de la coincidencia de patrones con los nombres en un directorio del sistema de archivos, de manera que un patrón de nombre se expande en una lista de nombres que coinciden con ese patrón. Aunque la expansión de patrones ahora puede referirse aglob()la coincidencia de patrones de cualquier cadena, no solo a la expansión en una lista de nombres del sistema de archivos, el significado original del término aún está muy extendido.

La glob()función y la gmatch()función subyacente se originaron en los Laboratorios Bell a principios de la década de 1970, junto con el propio AT&T UNIX original , y tuvieron una influencia decisiva en la sintaxis de las utilidades de línea de comandos de UNIX y, por lo tanto, también en las reimplementaciones actuales de las mismas.

En su forma original, glob()y gmatch()derivadas del código utilizado en las utilidades internas de Bell Labsglob que se desarrollaron junto con el Unix original a principios de la década de 1970. Entre esas utilidades también había dos herramientas de línea de comandos llamadas y find; cada una podía usarse para pasar una lista de nombres de archivo coincidentes a otras herramientas de línea de comandos, y compartían el código de backend formalizado posteriormente como glob()y gmatch(). El globbing a nivel de sentencia de shell por defecto se volvió común después de la integración "incorporada" de la funcionalidad de globbing en la séptima edición del shell de Unix en 1978. La opción -f del shell de Unix para deshabilitar el globbing es decir, volver al modo literal "archivo" apareció en la misma versión.

Los cuantificadores de patrones glob , estandarizados actualmente por POSIX.2 (IEEE Std 1003.2), se dividen en dos grupos y pueden aplicarse a cualquier secuencia de caracteres ("cadena"), no solo a las entradas de directorio.

  • "Metacaracteres" (también llamados "Comodines"):
    • ?(sin corchetes) coincide con cualquier carácter exactamente una vez.
    • *(sin corchetes) coincide con una cadena de cero o más caracteres.
  • "Rangos/conjuntos":
    • [...], donde el primer carácter dentro de los corchetes no es '!', coincide con cualquier carácter individual entre los caracteres especificados entre corchetes. Si el primer carácter dentro de los corchetes es '!', entonces [!...]coincide con cualquier carácter individual que no esté entre los caracteres especificados entre corchetes.
Los caracteres entre corchetes pueden ser una lista ( [abc]) o un rango ( [a-c]) o denotar una clase de caracteres (como [[:space:]]cuando los corchetes internos son parte del nombre de la clase). POSIX no exige la compatibilidad con rangos múltiples ( [a-c0-3]), que se derivan originalmente de las expresiones regulares .

A medida que proliferaban las reimplementaciones de UNIX de Bell Labs , también lo hacían las reimplementaciones de su libc y shell de Bell Labs, y con ellas glob()y globbing . Hoy en día, glob()y globbing están estandarizados por la especificación POSIX.2 y son parte integral de cada ecosistema libc y shell tipo Unix, incluyendo Korn shell (ksh) compatible con AT&T Bourne shell , Z shell (zsh) , Almquist shell (ash) y sus derivados y reimplementaciones como busybox , toybox , GNU bash , Debian dash .

Origen

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 (de la 1.ª a la 6.ª edición, 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 expandida de rutas de archivo al comando para su ejecución.

Glob fue escrito originalmente en el lenguaje de programación B. Fue el primer software principal de Unix que se desarrolló en un lenguaje de programación de alto nivel . [ 2 ] Posteriormente, esta funcionalidad se proporcionó como una función de biblioteca C , glob()utilizada por programas como el shell . Generalmente se define en base a una función llamada fnmatch(), que comprueba si una cadena coincide con un patrón dado; el programa que utiliza esta función puede entonces iterar a través de una serie de cadenas (generalmente nombres de archivo) 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 de comodín), una biblioteca simple para hacer coincidir cadenas con globs de Bourne Shell.

Tradicionalmente, los comodines no coinciden con archivos ocultos en forma de archivos ocultos 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 […].

Normalmente, el carácter separador de ruta ( /en Linux/Unix, MacOS, etc. o \en Windows) nunca coincidirá. Algunos intérpretes de comandos, como el intérprete de comandos de Unix, tienen una funcionalidad que permite a los usuarios eludir esto. [ 5 ]

Similar a Unix

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

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. Se definen para que coincidan con los corchetes en las expresiones regulares POSIX. [ 6 ] [ 7 ]

El uso de comodines en Unix es gestionado por el intérprete de comandos según la tradición POSIX. Los comodines se aplican a los nombres de archivo en la línea de comandos y en los scripts de shell . [ 8 ] La instrucción obligatoria de POSIX caseen los intérpretes de comandos proporciona coincidencia de patrones mediante patrones glob.

Algunos intérpretes de comandos (como C shell y Bash ) admiten una sintaxis adicional conocida como alternancia o expansión de llaves . Dado que no forma parte de la sintaxis glob, no se proporciona en case. Solo se expande en la línea de comandos antes de usar glob.

El intérprete de comandos Bash también admite las siguientes extensiones: [ 9 ]

  • El globbing extendido (extglob) permite utilizar otros operadores de coincidencia de patrones para hacer coincidir múltiples ocurrencias de un patrón encerrado entre paréntesis, proporcionando esencialmente la estrella de Kleene y la alternancia que faltaban para describir lenguajes regulares. Se puede habilitar configurando la extglobopción del shell. Esta opción proviene de ksh93. [ 10 ] GNU fnmatch y glob tienen una extensión idéntica. [ 3 ]
  • globstar: permite **por sí mismo, como componente de nombre, coincidir recursivamente con 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 Intel 8088 y 8086. Al igual que el DOS, los intérpretes de comandos de Windows no suelen realizar ninguna expansión de comodines en los argumentos que se pasan a programas externos. Los intérpretes de comandos 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[…] comparten la mayor parte de la sintaxis común, con algunas limitaciones: para COMMAND.COM no existe el símbolo " and". El símbolo "and *" solo puede aparecer al final del patrón. No puede aparecer en 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 larga cadena de línea de comandos en lugar de parámetros al estilo argv, y es su responsabilidad realizar cualquier división, comillas o expansión de comodines. Técnicamente, no existe una forma fija de describir los comodines en los programas, ya que estos tienen libertad para hacer lo que deseen. Dos expansores de comodines 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 en segundo plano, en su CRT central.
  • El expansor de línea de comandos de Cygwin y MSYS , que utiliza internamente dcrt0.ccuna rutina de estilo Unix , después de dividir los argumentos.glob()

La mayoría de las demás partes de Windows, incluido el Servicio de indexación, utilizan el estilo de caracteres comodín de MS-DOS que se encuentra en CMD. Esta sintaxis, una reliquia de la era de los nombres de archivo de la versión 8.3, 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 glob()equivalente es FindFirstFile(), y fnmatch()corresponde a su subyacente RtlIsNameInExpression(). [ 14 ] (Otro fnmatch()análogo es PathMatchSpec().) Ambos expansores msvcrt de código abierto utilizan FindFirstFile(), por lo que las peculiaridades de los nombres de archivo de la versión 8.3 también se aplicarán en ellos.

SQL

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

SQL estándar utiliza una sintaxis similar a glob para la coincidencia simple de cadenas en su LIKEoperador, 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 guion bajo ( _) coincide con exactamente uno.

Muchas implementaciones de SQL han extendido 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 sintaxis para la estrella de Kleene , que permite múltiples repeticiones de la parte precedente 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. [ 16 ]

Los comodines intentan coincidir con la cadena completa (por ejemplo, S*.DOCcoinciden con S.DOC y SA.DOC , pero no con POST.DOC ni SURREY.DOCKS ), mientras que, dependiendo de los detalles de implementación, las expresiones regulares pueden coincidir con una subcadena.

Implementación como expresiones regulares

La implementación original de autoconfiguración de proxy de Mozilla , que proporciona una función de coincidencia de comodines en cadenas, utiliza una implementación de reemplazo como expresión regular como la descrita anteriormente. La sintaxis de corchetes está cubierta por expresiones regulares en este ejemplo.

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 su uso en shells, los patrones glob también se utilizan en diversos lenguajes de programación, principalmente para procesar la entrada humana. En los siguientes lenguajes de programación se encuentra una interfaz de estilo glob para devolver archivos o una interfaz de estilo fnmatch para hacer coincidir cadenas:

  • C y C++ no tienen soporte incorporado para patrones glob en las bibliotecas estándar definidas por ISO, sin embargo, en sistemas tipo Unix, C y C++ pueden incluir <glob.h>desde la biblioteca C POSIX para usar ::glob().
    • C++ en sí mismo no tiene soporte directo para patrones glob, sin embargo, se pueden aproximar usando std::filesystem::directory_iteratory std::regex_match().
    • C++ tiene bibliotecas externas, como las bibliotecas POCO C++ , que incluyen una Poco::Globclase que puede operar con patrones glob. [ 18 ]
  • C# proporciona una biblioteca de extensión oficial Microsoft.Extensions.FileSystemGlobbing, [ 19 ] que contiene la clase Microsoft.Extensions.FileSystemGlobbing.Matcher. [ 20 ]
    • C# también tiene varias bibliotecas externas disponibles a través de NuGet, como Glob[ 21 ] o DotNet.Glob. [ 22 ]
  • D tiene una std.path.globMatch()función. [ 23 ]
  • Go tiene una filepath.Glob()función. [ 24 ]
  • Java proporciona una clase java.nio.file.Files[ 25 ] que tiene métodos como para operar sobre patrones glob y devuelve . Las clases y también se utilizan para hacer coincidir patrones glob.Files.newDirectoryStream(Pathdir,Stringglob)DirectoryStream<Path>java.nio.file.FileSystemsjava.nio.file.PathMatcher
  • Haskell tiene un Globpaquete con el módulo principal System.FilePath.Glob. La sintaxis de patrones se basa en un subconjunto de la 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. [ 26 ]
  • Node.js tiene una globfunción en el node:fsmódulo. [ 27 ]
  • Perl tiene tanto una globfunción (como se analiza en el libro Programming Perl de Larry Wall ) como una extensión Glob que imita la rutina glob de BSD. [ 28 ] Los corchetes angulares de Perl también se pueden usar para glob: .<*.log>
  • PHP tiene una globfunción. [ 29 ]
  • Python tiene un globmódulo en la biblioteca estándar que realiza coincidencia de patrones de comodines en nombres de archivo, [ 30 ] y un fnmatchmódulo con funciones para hacer coincidir cadenas o filtrar listas basándose en estos mismos patrones de comodines. [ 17 ] Guido van Rossum , autor del lenguaje de programación Python, escribió y contribuyó con una globrutina a BSD Unix en 1986. [ 31 ] 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 coincidencia de patrones comodín en nombres de archivo. [ 32 ] Varias bibliotecas como Rant y Rake proporcionan una FileListclase que tiene un método glob o usan el método FileList.[]de forma idéntica.
  • Rust en sí no tiene soporte incorporado para globbing, pero tiene múltiples bibliotecas de terceros que pueden coincidir con patrones glob, [ 33 ] la más popular de ellas es la globcrate que tiene una glob()función. [ 34 ]
  • SQLite tiene una GLOBfunción.
  • Tcl contiene una función de globbing. [ 35 ]

Véase también

Referencias

  1. "Sección 'Miscelánea' del manual de Unix de la primera edición (PDF)" (PDF) . Archivado del original (PDF) el 29 de agosto de 2000. Consultado el 11 de mayo de 2011 .
  2. McIlroy, MD (1987). Un lector de Research Unix: extractos anotados del Manual del programador, 1971–1986 (PDF) (Informe técnico). CSTR. Bell Labs. 139.
  3. 1 2Manual del programador de Linux – Funciones de la bibliotecafnmatch(3)  
  4. Manual del programador de Linux – Funciones de la bibliotecaglob(3)  
  5. https://www.gnu.org/software/bash/manual/bash.html#Pattern-Matching Archivado el 15/03/2018 en Wayback Machine Manual de referencia de Bash
  6. 1 2 "Especificaciones base de The Open Group, número 7, IEEE Std 1003.1, edición de 2013, 2.13. Notación de coincidencia de patrones" . Archivado del original el 27 de abril de 2014. Recuperado el 26 de octubre de 2015 .
  7. 1 2 "Manual del programador de Linux, GLOB(7)" . Archivado del original el 31-10-2015 . Recuperado el 26-10-2015 .
  8. La "Guía avanzada de scripting de Bash, capítulo 19.2: Globbing" (Mendel Cooper, 2003) contiene un conjunto conciso de ejemplos de patrones de globbing de nombres de archivo.
  9. "Bash globs" . Base de conocimientos de bash de Greg . Archivado del original el 18/11/2019 . Consultado el 25/11/2019 .
  10. 1 2 "Coincidencia de patrones" . Manual de referencia de Bash . Archivado del original el 11 de febrero de 2016. Consultado el 11 de enero de 2016 .
  11. "Compatibilidad con caracteres comodín en parámetros de cmdlets" . Microsoft . Microsoft Developer Network. 18 de diciembre de 2023.
  12. "Expansión de comodines" . Microsoft Developer Network. 2013. Archivado del original el 22 de agosto de 2014. Consultado el 16 de octubre de 2013 .
  13. "Expansión de comodines" . docs.microsoft.com . 8 de febrero de 2022.
  14. Comodines en Windows Archivado el 24/12/2019 en Wayback Machine . MSDN Devblog.
  15. "LIKE (Transact-SQL)" . 23/05/2023. Archivado del original el 02/08/2017 . Consultado el 01/08/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. 1 2 "Lib/fnmatch.py" . Python. 2021-01-20. Archivado del original el 2021-11-10 . Recuperado el 2021-11-10 .
  18. "Clase Poco::Glob" . docs.pocoproject.org . Consultado el 13 de agosto de 2025 .
  19. "NuGet Gallery Microsoft.Extensions.FileSystemGlobbing" . www.nuget.org . Consultado el 17 de agosto de 2025 .
  20. "Globbing de archivos en .NET" . learn.microsoft.com . Consultado el 17 de agosto de 2025 .
  21. "kthompson/glob" . GitHub . Archivado del original el 26/10/2020 . Consultado el 06/11/2020 .
  22. "dazinator/dotnet.glob" . GitHub . Archivado del original el 22/06/2022 . Consultado el 22/06/2022 .
  23. "std.path - Lenguaje de programación D - Digital Mars" . dlang.org. Archivado del original el 8 de septiembre de 2014. Consultado el 8 de septiembre de 2014 .
  24. "Ruta de archivo del paquete - El lenguaje de programación Go" . Golang.org. Archivado del original el 25 de mayo de 2011. Consultado el 11 de mayo de 2011 .
  25. "Operaciones de archivos" . Oracle. Archivado del original el 20 de septiembre de 2013. Consultado el 16 de diciembre de 2013 .
  26. "Glob-0.7.4: Biblioteca de globbing" . Archivado del original el 8 de mayo de 2014. Consultado el 7 de mayo de 2014 .
  27. "Sistema de archivos - Documentación de Node.js" . Archivado del original el 16 de julio de 2025. Consultado el 16 de julio de 2025 .
  28. "File::Glob - Extensión de Perl para la rutina glob de BSD" . perldoc.perl.org . Consultado el 11 de mayo de 2011 .
  29. "glob - Manual" . PHP. 6 de mayo de 2011. Archivado del original el 13 de noviembre de 2017. Consultado el 11 de mayo de 2011 .
  30. "10.7. glob — Expansión de patrones de ruta de archivo al estilo Unix — Documentación de Python v2.7.1" . Docs.python.org. Archivado del original el 16 de mayo de 2011. Consultado el 11 de mayo de 2011 .
  31. "Rutina de biblioteca "Globbing" . Archivado del original el 19/12/2007 . Consultado el 11/05/2011 .
  32. "Clase: Dir" . Ruby-doc.org. Archivado del original el 15 de mayo de 2011. Consultado el 11 de mayo de 2011 .
  33. "#glob - Lib.rs" . lib.rs . Archivado del original el 12-11-2021 . Recuperado el 12-11-2021 .
  34. "glob - Lib.rs" . lib.rs . Consultado el 17-01-2025 .
  35. "Página del manual de TCL glob" . Archivado del original el 8 de diciembre de 2011. Consultado el 16 de noviembre de 2011 .