Dominá los comodines de Bash: Dejá de escribir nombres de archivos a mano

DUGLAS MORENODUGLAS MORENO 👁 20

Si alguna vez te pasó de tener que borrar cien archivos que empiezan con 'temp_' o copiar todas las imágenes de una carpeta, sabés que escribir uno por uno es un dolor de cabeza. Ahí es donde entran los comodines (o wildcards), que te permiten hacer coincidir patrones de nombres de archivos y directorios de forma súper eficiente.

En Bash, el proceso de expandir estos patrones se llama globbing. El shell busca en el sistema de archivos los elementos que encajan con el patrón y reemplaza el comodín por la lista real de archivos antes de ejecutar el comando.

Los comodines fundamentales

1. El asterisco (*)

Es el comodín más usado. Representa cero o más caracteres. Básicamente, le decís a Bash: "no me importa qué haya acá, mientras coincida con el resto".

Ejemplo con ls:
Si tenés archivos llamados notas.txt, notas_finales.doc y foto.jpg:

ls notas*

Salida esperada:
notas.txt notas_finales.doc

2. El signo de pregunta (?)

A diferencia del asterisco, el signo de pregunta representa exactamente un único carácter. Es ideal cuando sabés la longitud exacta del nombre.

Ejemplo con ls:
Si tenés archivo1.txt, archivo2.txt y archivo10.txt:

ls archivo?.txt

Salida esperada:
archivo1.txt archivo2.txt (Nota que archivo10.txt queda afuera porque tiene dos caracteres donde pusimos el ?)

3. Los corchetes [ ] (Conjuntos y Rangos)

Acá es donde la cosa se pone interesante. Los corchetes te permiten definir un conjunto de caracteres permitidos para una sola posición.

  • Conjunto específico [abc]: Coincide con cualquiera de los caracteres adentro (en este caso, 'a', 'b' o 'c').
  • Rangos [0-9] o [a-z]: Coincide con cualquier carácter dentro de ese rango.

Ejemplo con cp:
Imaginá que tenés log1.txt, log2.txt y log_error.txt. Querés copiar solo los que tienen un número del 1 al 2 a una carpeta llamada backup:

cp log[1-2].txt backup/

Resultado: Se copian log1.txt y log2.txt.

4. La negación [! ]

Si ponés un signo de exclamación al principio dentro de los corchetes, Bash buscará cualquier carácter que NO esté en esa lista.

Ejemplo con rm:
Tenés data_1.csv, data_2.csv y data_a.csv. Querés borrar todo lo que NO sea un número:

rm data_[!0-9].csv

Resultado: Se borra data_a.csv y quedan intactos los archivos numéricos.

Poniéndolo todo en práctica: Un flujo real

Supongamos que estás limpiando un proyecto. Tenés una carpeta llena de archivos temporales y querés organizar el caos:

  1. Listar todos los archivos .log y .txt:

    ls *.log *.txt
    
  2. Mover todos los archivos que empiecen con 'test' seguido de un solo dígito a una subcarpeta:

    mkdir tests_old
    mv test[0-9].js tests_old/
    
  3. Borrar archivos que no empiecen con 'importante' o 'final':
    (Cuidado con este comando, siempre hacé un ls antes para verificar qué vas a borrar)

    rm [!i][!f]*
    

Tips finales para no romper nada

  • El peligro de rm *: Nunca ejecutes un comando de borrado con comodines sin estar seguro. Un espacio mal puesto (ej: rm * .txt en vez de rm *.txt) podría borrar todo el contenido de tu directorio actual.
  • Probá con echo: Si no estás seguro de qué archivos va a capturar tu patrón, usá echo antes que rm o cp:
    echo *.jpg
    
    Esto te mostrará en pantalla exactamente qué archivos expandió Bash antes de que hagas cualquier cambio permanente.

Comentarios (0)

Sé el primero en comentar.

Dejá tu comentario