Inicio / Artículos / Cambiando nombre de archivos con BASH

Artículos

Cambiando nombre de archivos con BASH

Tantos archivos en Mayúculas o minúsculas y la necesidad de cambiarlos todos de forma rápida y sencilla...

De vez en cuando nos topamos con la necesidad de cambiar gran cantidad de nombre de archivos, ya sea para pasarlos a minúsculas o simplemente por equivocarnos al crearlos.

Realizar la tarea de renombrado "a mano" puede tornarse interminable y peligroso para nuestro estado de ánimo. Pero, mediante el BASH, podemos realizar esta tarea de forma muy sencilla y rápida.

Solución rápida.

Para realizar el cambio de una gran cantidad de nombre de archivos podemos utilizar listas en BASH y un lazo para revisar todos y cada uno de los archivos de un directorio.
¿Qué es una lista en BASH?
Una lista es uno o varios patrones con los cuales debe cumplir una unidad de información (un nombre de archivo en nuestro caso) y se definen entre corchetes "[ ]". Así, si deseamos consultar los nombres de archivos que comiencen con una vocal utilizamos lo siguiente:

ls [a,e,i,o,u]*

O todos los archivos que comiencen con un número:

ls [0-9]*

Note que ambos ejemplos difieren en la forma de plantear las listas. En el primero se utiliza la lista completa de las vocales y en el segundo utilizamon un rango, "del cero al nueve"; si utilizamos un rango en la primera, digamos:

ls [a-u]*

Entonces los archivos que comiencen con todas las letras del abecedario, desde
la "a" hasta la "u", será mostrados. Lo anterior es equivalente a colocar:

ls [a,B,b,C,c,D,d,E,e,F,f,G,g,H,h,I,i,J,j,K,k,L,l,M,m,N,n,O,o,

P,p,Q,q,R,r,S,s,T,t,U,u]*

(todo en la  misma línea)

Esto para el uso con 'ls', que interpreta la lista sin distinción de mayúsculas o minúsculas en algunas codificaciones. Así que utilice esto con cuidado ;-)

Las listas no sólo se utilizan al inicio de la expresión, si no en cualquier parte de la misma.

Ejemplo:

ls hola[1,3,z]*

Nos muestra todos los archivos que comiencen con la palabra hola y a continuacion que contengan el número 1, el 3 o la letra "z", seguido por cualquier cosa (recuerde que el asterisco es un comodín utilizado en la mayoría de los casos).

Aclarado todo esto, vamos ahora a un caso práctico:
"Cambiar los nombres de archivos de mayúsculas a minúsculas".

Existe un comando que traslada o borra caracteres de una expresion llamado "tr". En nuestro caso práctico sería algo como:

tr '[A-Z]' '[a-z]'

Observe las 2 listas A-Z y a-z, las cuales definen que todos las letras mayúculas encontradas de la "A" a la "Z", deben ser trasladadas a su equivalente en minúsculas. Pero este comando "tr" no hace nada por si sólo, así que, debemos darle más información para que pueda trabajar.

Veamos la solución definitíva paso a paso.

Primero definimos un lazo que consulte todos los nombres de archivos, utilizando "for" y "do" de la siguiente forma:

for i in * ; do [ -f "$i" ] &&

La traducción a castellano común es -> "para todos los archivos encontrados hacer con cada uno lo que viene a continuación de los 2 ampersand (&&) si no hay ningún error...". En este caso, el "for" le entrega a "do" una variable "i" que representa los archivos (¿recuerda que asterisco es un comodín?), entonces "do" toma este valor y busca el archivo correspondiente, utilizando para ello la expresión "[ -f "$i" ]" y a continuación utilizamos en comando de mover archivos "mv" de la siguiente forma:

mv $i `echo "$i" | tr '[A-Z]' '[a-z]' `; done;

No se asuste, las cosas son más simples de lo que aparentan. Si repasamos un poco la sintáxis del comando "mv" (mover) vemos que se define un origen y un destino. Así, si deseamos mover un archivo de un directorio a otro utilizamos algo como "mv /datos/elArchivo /respaldo/elArchivo". Así mismo si buscamos cambiar el nombre del archivo, utilizamos "mv elArchivo otroArchivo". Entonces, según lo expresado en nuestro ejemplo, el origen viene dado por el primer "$i" y el destino por la expresión contenida entre comillas sencillas invertidas " ` ". En BASH, cualquier cosa contenida entre este tipo de comillas, es tratado como un comando y por lo tanto lo ejecuta
en lugar de tratarlo como una expresión o literal. Entonces, toma el valor "$i" que viene del "for" anterior y representa el nombre del archivo y mediante "echo" dice este nombre de archivo enviando la salida al comando "tr" mediante la tubería "|". Y como vimos anteriormente, el comando "tr" traslada el texto "$i" que representa el nombre del archivo, de mayúculas a minúsculas.

Juntando todo en un archivo para que se ejecute:

#!/bin/bash
for i in * ; do [ -f "$i" ] && mv "$i" `echo "$i" | \ 

 tr '[A-Z]' '[a-z]'`;

done;

Si quiere darle mejor aspecto, puede utilizar el carácter de continuación en la siguiente linea "\":

#!/bin/bash
for i in * ; do [ -f "$i" ] && \
 mv "$i" `echo "$i" | \
 tr '[A-Z]' '[a-z]'`;
done;

TIP: "tr" tiene predefinidos [:upper:] y [:lower:] que representan mayúsculas y minúculas respectívamente, con lo cual puede expresar lo mismo con "tr '[:upper:]' '[:lower:]'.Quedando finalmente:

#!/bin/bash
for i in * ; do [ -f "$i" ] && \
 mv "$i" `echo "$i" | \
 tr '[:upper:]' '[:lower:]'`;
done;

(Artículo publicado en el portal anterior en fecha: 16/11/2005)

Comentarios

Log in or create a user account to comment.