glob

GLOB(7)                  Manual del Programador de Linux                 GLOB(7)



NOMBRE
       glob - Generación de nombres de rutas de ficheros

DESCRIPCIÓN
       Hace mucho tiempo, en Unix V6, había un programa en /etc/glob que
       expandía patrones con comodines.  Poco después este programa se convirtió
       en una orden incorporada en el shell.

       Hogaño existe también una rutina de biblioteca glob(3) que efectúa esta
       función para un programa de usuario.

       Las reglas son como sigue (POSIX 1003.2, 3.13).


CONCORDANCIA DE COMODINES
       Una cadena de caracteres es un patrón con comodines si contiene uno al
       menos de los caracteres `?', `*' o `['. La generación de nombres de
       caminos (en inglés, `globbing') es la operación que expande un patrón con
       comodines formando una lista de nombres de caminos de ficheros que
       concuerdan con el patrón. La concordancia se define así:

       Un signo de cierre de interrogación `?' (no entre corchetes) concuerda
       con cualquier carácter simple.

       Un asterisco `*' (no entre corchetes) concuerda con cualquier cadena de
       caracteres, incluyendo la cadena vacía.


   Clases de caracteres
       Una expresión entre corchetes `[...]' donde el primer carácter tras el
       corchete de apertura `[' no es un signo de cierre de admiración `!',
       concuerda con un carácter simple; a saber, cualquiera de los caracteres
       encerrados entre los corchetes.  La cadena encerrada entre los corchetes
       no puede estar vacía; por ello, el corchete de cierre `]' puede estar
       entre los corchetes, siempre que sea como el primer carácter. (Así,
       `[][!]' concuerda con uno de los tres caracteres `['. `]' y `!'.)


   Rangos
       Existe un convenio especial: dos caracteres separados por el guión `-'
       denotan un rango.  (Así, `[A-Fa-f0-9]' es equivalente a
       `[ABCDEFabcdef0123456789]'.)  Se puede incluir el guión `-' con su
       sentido literal poniéndolo como el primer o el último carácter entre los
       corchetes.  (Así, `[]-]' concuerda justo con uno de los dos caracteres
       `]' o `-', y `[--/]' concuerda con uno de los tres caracteres `-', `.', '
       /'.)


   Complementación
       Una expresión `[!...]' concuerda con un carácter simple; a saber,
       cualquier carácter que no concuerde con la expresión obtenida al quitar
       el primer cierre de admiración `!' de ella.  (Así, `[!]a-]' concuerda con
       cualquier carácter simple excepto `]', `a' y `-'.)

       Uno puede anular el significado especial de `?', `*' y `[' haciéndolos
       preceder de una barra inclinada invertida `\', o, en caso de formar parte
       de una orden del shell, encerrándolos entre comillas.  Entre corchetes,
       estos caracteres se representan a sí mismos.  Así, `[[?*\]' concuerda con
       uno de los cuatro caracteres `[', `?', `*' y `\'.


NOMBRES DE CAMINOS
       La expansión se aplica a cada uno de los componentes de un nombre de
       camino por separado. Una barra inclinada `/' en un nombre de camino no
       puede concordar con un comodín `?' ni `*', ni con un rango como `[.-0]'.
       Un rango no puede contener un carácter `/' explícito; esto llevaría a un
       error de sintaxis.

       Si un nombre de fichero comienza con un punto `.', este carácter debe
       concordar explícitamente.  (Así, `rm *' no borrará, por ejemplo,
       .profile, y `tar -c *' no archivará todos sus ficheros; `tar -c .' es
       mejor.)


LISTAS VACÍAS
       La bonita y simple regla dada arriba: `expandir un patrón de comodines a
       una lista de nombres de caminos que concuerdan' fue la definición
       original de Unix. Le permitía a uno tener patrones que se `expandían' a
       una lista vacía, como en
            xv -wait 0 *.gif *.jpg
       donde quizás no había ningún fichero GIF presente (y esto no es un
       error).  Sin embargo, POSIX requiere que un patrón de comodines se deje
       sin cambios cuando sea sintácticamente incorrecto o cuando la lista de
       nombres de camino concordantes esté vacía.  Con bash uno puede forzar el
       comportamiento clásico estableciendo allow_null_glob_expansion=true y con
       zsh con setopt null_glob.  (Problemas similares ocurren por todas partes.
       Por ejemplo, donde guiones viejos tengan
            rm `find . -name "*~"`
       los nuevos requerirán
            rm -f no-tal-fichero `find . -name "*~"`
       para evitar mensajes de error de rm llamado con una lista de argumentos
       vacía.)


OBSERVACIONES
   Expresiones regulares
       Observe que los patrones de comodines no son expresiones regulares,
       aunque son algo similares. Lo primero, concuerdan con nombres de ficheros
       en vez de con texto, y lo segundo, los convenios no son los mismos:
       p.ej., en una expresión regular `*' significa cero o más copias de lo
       precedente.

       Ahora que las expresiones regulares tienen expresiones de corchetes donde
       la negación se indica por un acento circunflejo `^', POSIX ha declarado
       que el efecto de un patrón `[^...]' está indefinido. En zsh tiene el
       mismo efecto que `[!...]'.


   Clases de caracteres e internacionalización
       Por supuesto los rangos significaban originalmente rangos ASCII, así que
       `[ -%]' significaba `[ !"#$%]' y `[a-z]' quería decir "cualquier letra
       minúscula".  Algunas implementaciones de Unix generalizaron esto de forma
       que un rango X-Y significara el conjunto de caracteres cuyos códigos
       estuvieran entre los de X y los de Y. Sin embargo, esto requiere que el
       usuario conozca la codificación de caracteres que se emplee en el sistema
       local, y aún más, esto no es conveniente si la secuencia de clasificación
       para el alfabeto local difiere del ordenamiento de los códigos de
       caracteres.  Por lo tanto, POSIX extendió grandemente la notación de
       corchetes, tanto para patrones de comodines como para expresiones
       regulares.  Antes vimos tres tipos de elementos que pueden estar en una
       expresión de corchetes; a saber, (I) la negación, (II) caracteres simples
       explícitos, y (III) rangos. POSIX especifica los rangos de una manera más
       útil internacionalmente y añade tres tipos más:

       (III) Los rangos X-Y comprenden todos los caracteres que caigan entre X e
       Y (incluidos) en la secuencia de clasificación en curso según se defina
       en la categoría LC_COLLATE para la localización o escenario actual.

       (IV) Clases de caracteres nombradas, como
       [:alnum:]  [:alpha:]  [:blank:]  [:cntrl:]
       [:digit:]  [:graph:]  [:lower:]  [:print:]
       [:punct:]  [:space:]  [:upper:]  [:xdigit:]
       de modo que uno pueda decir `[[:lower:]]' en vez de `[a-z]', con el
       significado de cualquier letra minúscula, y esto funcione por ejemplo
       también en Dinamarca, donde hay tres letras en el alfabeto después de la
       zeta.  Estas clases de caracteres están definidas por la categoría
       LC_CTYPE en el escenario en curso.

       (V) Símbolos de colación, como `[.ch.]' o `[.a-acute.]', donde la cadena
       entre `[.' y `.]' es un elemento de colación definido por el escenario en
       curso. Observe que esto puede ser un elemento multi-carácter.

       (VI) Expresiones de clase de equivalencia, como `[=a=]', donde la cadena
       entre `[=' y `=]' es cualquier elemento de colación de su clase de
       equivalencia, según se defina para el escenario en curso. Por ejemplo,
       `[[=a=]]' podría ser equivalente a `[aáàäâãäå]' (aviso: esto es Latin1);
       esto es, equivalente a `[a[.a-acute.][.a-grave.][.a-umlaut.][.a-
       circumflex.][.a-tilde.][.a-ring.]]'.


VÉASE TAMBIÉN
       sh(1), glob(3), fnmatch(3), locale(7), regex(7)



Unix                              12 Junio 1998                          GLOB(7)