04 febrero 2009

Renombrar multiples archivos

Quitarle el texto de "IMG_" a todos los archivos dentro de un directorio. Si fueran pocos archivos no dudaría en cambiar los nombres manualmente. La cosa se complica cuando estamos hablando de una cantidad considerable de archivos (decenas, cientos o quizás miles). Existen muchas opciones para hacer esto. Una opción es usar algún software que lo haga por uno, en www.download.com siempre hay opciones tanto para comprar como para descargar gratis. Otra opción es usar lo que el sistema operativo pueda hacer de forma nativa ya sea de forma gráfica (con mouse y ventanas) o en modo texto (en línea de comandos). No estoy en contra del modo gráfico, al contrario, ayuda mucho a los usuarios a no cometer graves errores al darte sólo las opciones necesarias. En ese ámbito Mac sabe perfectamente lo que hace. En el caso de Windows, pienso que ha mejorado mucho pero aún recuerdo una ocasión cuando un maestro de la universidad andaba pidiendo el disco de instalación de Windows 95 porque había borrado "accidentalmente" la carpeta de "C:\Windows" ya que no sabía qué era... y lo peor del caso, el sistema se lo permitió. Digo, nunca supe si había pasado realmente o no pero a ese tipo de usuarios me refiero. En el caso de Linux y de cualquier "sabor" de Unix en general, yo diría que es un sistema operativo muy "obediente" que si uno le pide "hazte hara-kiri", si no hay impedimento alguno para cumplirlo, lo hará sin miramientos ya que parte de su filosofía es de que quien le ordena sabe muy bien lo que está haciendo. Pero bueno, regreso al meollo del asunto. Para renombrar múltiples archivos hay de igual forma múltiples alternativas para lograrlo. Por ejemplo, en Linux la forma más natural y efectiva sería usando comandos en bash. Quizá no sea la manera la más sencilla pero cumple su cometido.

$ ls
IMG_0001.jpg IMG_0002.jpg IMG_0003.jpg
$
$ for old in IMG_*.jpg

> do
> new=`echo $old | sed s/IMG_//g`
> mv $old $new
> echo $old "->" $new
> done
IMG_0001.jpg -> 0001.jpg
IMG_0002.jpg -> 0002.jpg
IMG_0003.jpg -> 0003.jpg
$
$ ls

0001.jpg 0002.jpg 0003.jpg

O lo que es lo mismo pero en una línea y de manera "silenciosa":

$ for old in IMG_*.jpg; do mv $old `echo $old | sed s/IMG_//g`; done

En los ejemplos anteriores se parte de que se está ubicado en el directorio que contiene todos los archivos y que comienzan con el texto "IMG_". La serie de comandos remueven ese texto de manera automática y sin dolor más que el de hacerlo en modo texto. En Windows también se podría hacer este truco usando Cygwin, que es una herramienta que permite ejecutar ciertos comandos básicos como si se estuviera en Linux pero sin instalarlo en realidad.

2 comentarios:

Anónimo dijo...

Gracias tío, esta es una de las pocas cosas que en MSDOS era más fácil ;)

R2F dijo...

gracias por la info, pero tengo una duda, si quiero modificar todos los nombres de los archivos pero tambien contenidos en subdirectorios como puedo hacerlo?