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.
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.
