12.6. Expansión de nombres de ficheros
A menudo se desea que una orden trabaje con un grupo de ficheros. Los comodines
(wildcards) se utilizan para crear patrones de expansión de nombres: una serie de
caracteres y comodines que se expanden formando una lista de nombres de
ficheros. Por ejemplo, el patrón /etc/* se expande en forma de lista de
todos2
los ficheros de /etc.
* es un comodín que se corresponde a una ristra de caracteres, de manera que el
patrón /etc/* se expandirá formando una lista de todos los ficheros que comiencen
por /etc/.
Esta lista de nombres de ficheros es más útil como argumento de una orden. Por
ejemplo, el directorio /etc contiene varios directorios denominados rc0.d, rc1.d,
etc. Normalmente, para ver su contenido escribiría lo siguiente:
ls /etc/rc0.d /etc/rc1.d /etc/rc2.d /etc/rc3.d
ls /etc/rc4.d /etc/rc5.d /etc/rc6.d /etc/rcS.d
Como resulta tedioso, en su lugar podemos utilizar el comodín ?, tal como vemos
aquí:
/etc/rc?.d se expande en una lista de nombres de ficheros que comienzan por rc,
seguido de un carácter cualquiera, seguido a su vez por .d.
Los comodines disponibles son los siguientes:
-
*
- Se corresponde con cualquier grupo de 0 o más caracteres.
-
?
- Se corresponde con exactamente (ni más, ni menos) un carácter.
-
[...]
- Si encierra varios caracteres entre corchetes, el resultado es un comodín
que se corresponde con esos caracteres. Por ejemplo, [abc] se corresponde
con la a, b o la c. Si añade una ^ justo después del primero corchete, se
invierte el significado; de manera que [^abc] se corresponde con cualquier
carácter que no sea a, b o c. Puede incluir rangos, como [a-j], que se
correspondan con cualquier carácter entre a y j. La correspondencia es
dependiente de si las letras son mayúsculas o minúsculas, de manera que
para permitir cualquier letra, tendrá que utilizar [a-zA-Z].
Los patrones de expansión son sencillos de comprender una vez que ha visto algunos
ejemplos concretos:
-
*.txt
- Esto le proporcionará una lista de todos los ficheros que acaben en .txt,
ya que * se corresponde con cualquier cosa.
-
*.[hc]
- Esto le proporciona una lista de ficheros cuyo nombre acabe tanto en .h
como en .c.
-
a??
- Le devuelve todos los nombres de ficheros de tres letras que comiencen por
a.
-
[^a]??
- Se corresponde con todos los ficheros cuyo nombre sea de tres letras y
no comience por a.
-
a*
- Esto le da todos los nombres de fichero que comiencen por a,
independientemente de cuántas letras los compongan.