Shell Bash: Expansión de nombres de ficheros y directorios

La semana pasada hicimos una introducción breve al Bash e incluso vimos como acceder al mismo y como verificar la versión que tenemos instalada a través de algunos comando básicos. El día de hoy hablaremos de los comodines.

 

Los Comodines

Para referirnos a varios ficheros es muy típico usar los comodines de la Tabla de abajo. Un sitio típico donde se usan los comodines es el comando ls. Este comando sin argumentos lista todos los ficheros del directorio, pero le podemos pasar como argumentos los nombres de los ficheros que queremos listar:

$ ls carta.txt leeme.txt

Si lo que le damos son los nombres de uno o más directorios lo que hace es listar su contenido.

 

Muchas veces queremos referirnos a un conjunto de ficheros para lo cual usamos comandos de la forma:

 $ ls *.txt

 Que lista todos los ficheros acabados en .txt.

* representa cero o más caracteres, con lo que *ed encontraría el fichero ed.

Otro comodín menos usado es ? que sustituye por un sólo carácter, por ejemplo:

$ ls carta?.txt

Listaría ficheros como carta1.txt, carta2.txt, pero no carta10.txt.

El tercer comodín permite indicar un conjunto de caracteres que son válidos para hacer la sustitución, p.e. c[ao]sa encontraría el fichero casa y cosa, pero no cesa. Además podemos indicar un conjunto de caracteres ASCII consecutivos, por ejemplo [a-z] serían todas las letras minúsculas, [!0-9] serían todos los caracteres ASCII excepto los dígitos, y [a-zA-Z0-9] serían todas las letras mayúsculas, minúsculas y los dígitos.

La razón por la que este comodín no ha sido tan usado como se esperaba es que expande por un, y sólo un dígito, por ejemplo programa .[co] encontraría programa.c y programa.o, pero no programa.cpp.

Es importante tener en cuenta que los comandos cuando se ejecutan no ven los comodines sino el resultado de la expansión. Por ejemplo si ejecutamos el comando:

$ cp g* /tmp

g* se expande por todos los ficheros que cumplen el patrón, y esto es lo que se pasa al comando cp, pero si no existiera ningún fichero cuyo nombre cumpliese el patrón g*, este valor no se expande sino que se pasa tal cual al comando, y éste será el que fallará:

         $ cp g* /tmp/

cp: g*: No such file or directory

Es decir, como podríamos pensar, al fallar no se pasa una lista vacía al comando. Piense por un momento lo que ocurriría con algunos comandos si se hubiese diseñado así.

Este funcionamiento es ligeramente distinto al de tcsh, donde si no se expande el comodín no se ejecuta el comando, en Bash se ejecuta el comando aunque luego éste produzca un error.

Quizás esta guía se vea un poco mecánica en principio, pero les aseguro que eso cambiará muy pronto. El próximo día abordaremos los siguientes comodines y haremos nuestro primer test online.

 

About Domadis Cabrera

Geek por naturaleza. Technorati por pasión. Emprendedor y amante del buen diseño. Disfruto probando cualquier cosa relacionada con la tecnología, da igual si es software o hardware. Viajero frecuente y amante de la adrenalina. Me divierte solucionar problemas y puedes seguirme en tu red social favorita, sólo tienes que buscarme por mi nombre.

Deja tu respuesta

d74ca0a187f0ec6b40686c25dcd3d262557c7e84d8ef45591f