Saltar la navegación

Expansión de nombres de ficheros

Tras la separación de palabras, bash escanea cada palabra en busca de los caracteres '*', '?' y '['. Si aparece alguno de estos caracteres, la palabra es considerada como un patrón, y reemplazada por una lista alfabéticamente ordenada de nombres de ficheros que se ajusten al patrón. Si no se encuentra ningún nombre concordante con el patrón, y la opción del shell nullglob está deshabilitada, la palabra permanece sin cambios, pero si está habilitada, la palabra es eliminada. Si la opción del shell failglob está habilitada y no se encuentran concordancias, se imprime un mensaje de error y el comando no se ejecuta. Si la opción del shell nocaseglob está activada, se realiza el ajuste sin tener en cuenta la diferencia entre mayúsculas y minúsculas para los caracteres alfabéticos.

Las opciones nocaseglob, nullglob y failglob del shell se establecen con la orden interna shopt, pero esto se verá más adelante.

Cualquier carácter que aparezca en un patrón, distinto de los caracteres especiales para patrones descritos más abajo, concuerda consigo mismo, es decir, se tratan como caracteres literales. La barra invertida permite convertir en caracteres literales a los caracteres especiales, es decir, les quita su significado especial.

Los caracteres especiales para patrones en tipo expansión de ficheros tienen los siguientes significados:

* Concuerda con cualquier cadena, incluida la cadena nula, es decir, concuerda con cero o más caracteres.
? Concuerda con cualquier carácter individual.
[...]  

Concuerda con uno cualquiera de los caracteres encerrados entre corchetes. Un par de caracteres separados por un guión (-) indican una expresión de rango; cualquier carácter que por orden ASCII se sitúe entre esos dos caracteres, incluyendo a ambos extremos, concuerda con la expresión. Si el primer carácter que sigue al '[' es un '!' o un '^', entonces concuerda con cualquier carácter no encerrado entre los corchetes. Un '-' puede concordar consigo mismo incluyéndolo como el primer o el último carácter en el conjunto de caracteres especificado. Un ']' puede concordar consigo mismo incluyéndolo como el primer carácter en el conjunto.

Dentro de los corchetes se pueden especificar clases de caracteres usando la sintaxis [:clase:], donde clase es una de las siguientes clases definidas en el estándar POSIX:

alnum alpha ascii blank cntrl digit graph lower print punct space upper word xdigit

Una clase de caracteres concuerda con cualquier carácter que forme parte de esa clase. Por ejemplo, la clase word concuerda con las letras, los dígitos y el carácter '_' (guión bajo).

Para listar todos los ficheros terminados en .rpm

$ ls *.rpm

Para listar los ficheros que empiecen por letra minúscula y tengan extensión .rpm

$ ls [a-z]*.rpm

Para listar todos los ficheros que empiezan por un número, podríamos hacerlo así:

$ ls [0-9]*

o bien:

$ ls [[:digit:]]*

Para listar los ficheros que empiezan por “.b”, “.x” y “.X”

$ ls .[bxX]*

Para listar los ficheros cuya extensión tenga 2 caracteres

$ ls *.??

Si la opción del shell extglob se ha activado usando el comando interno shopt, se reconocerán varios operadores de patrones extendidos. En las descripciones siguientes, el término lista-patrones es una lista de uno o más patrones separados por el carácter |. Se pueden formar patrones compuestos usando uno o más de los siguientes subpatrones:

Patrón Significado
 ?(lista-patrones) Concuerda con cero o una ocurrencia de los patrones dados.
 *(lista-patrones) Concuerda con cero o más ocurrencias de los patrones dados
 +(lista-patrones) Concuerda con una o más ocurrencias de los patrones dados.
 @(lista-patrones)    Concuerda con uno de los patrones dados.
 !(lista-patrones) Concuerda con cualquier cosa que no se ajuste a los patrones dados.   

Veamos algunos ejemplos:

  • Listar todos los ficheros de extensión .jpg o .gif que comiencen por abril o mayo.
$ ls @(abril|mayo)*.@(jpg|gif)

Otra forma de hacer lo mismo hubiera sido:

$ ls abril*.jpg abril*.gif mayo*.jpg mayo*.gif

También es válido:

$ ls {abril,mayo}*.{jpg,gif}
  • Listar todos los ficheros que no tengan la extensión .jpg o .gif.
$ ls !(*.jpg|*.gif)
  •  Eliminar todos los ficheros menos resumen.txt.
$ rm !(resumen.txt)
  • Listar todos los ficheros de nombre carta y un número.
$ ls carta+([0-9])

 

Licencia: licencia de software libre GPL