El shell de linux: Comando rename - Renombrado masivo de archivos | Algo de Linux

viernes, 13 de noviembre de 2009

El shell de linux: Comando rename - Renombrado masivo de archivos

Cuando se trabaja fundamentalmente en terminales de línea de comandos nos viene muy bien conocer herramientas como rename.

rename es un comando que nos permite renombrar archivos de forma masiva desde la shell de Linux, es decir, que no tenemos más que ejecutar un comando para renombrar una lista de archivos con un patrón común.

La sintaxis del comando rename es muy sencilla:

rename perlexpr [ archivos ]

Dónde:
  • perlexpr es una expresión regular en lenguaje Perl.
  • y [archivos] es la lista de archivos a los que afectará el comando.
Quizás lo más complicado sea hacer las expresiones regulares.

Veamos un ejemplo sencillo: Imaginemos que queremos cambiar la extensión de los archivos .txt del directorio actual por .csv . No tendremos más que ejecutar el comando rename de la siguiente manera:

# rename 's/\.txt/\.csv/' *.txt
  • 's/\.txt/\.csv/' es la expresión regular que dice "cambia .txt por .csv".
  • * .txt es la lista de archivos a los que hay que aplicarles el cambio.
Otro ejemplo: Supongamos que queremos convertir a minúsculas todos los caracteres del conjunto de archivos contenidos en el directorio actual:

# rename 'y/A-Z/a-z/' *
  • 'y/A-Z/a-z/' es la expresión regular que dice "cambia los caracteres mayúsculas por minúsculas".
  • * le dice al comando que lo haga en todos los archivos.
Otro ejemplo: Imaginemos que queremos eliminar la extensión de todos los archivos que tengan extensión .bak en el directorio actual:

# rename 's/\.bak$//' *.bak
  • 's/\.bak$//' le dice al comando que renombre los archivos terminados en .bak por el nombre del archivo sin .bak, es decir, que elimine el .bak.
  • *.bak le dice al comando que actúe sólo en los archivos con extensión .bak del directorio actual.
En estos ejemplos hemos trabajado sólo en el directorio actual, pero se puede especificar un directorio cualquiera. Por ejemplo:

# rename 's/gestor/profesor/' /home/profesor/archivos/*

Una cuestión importante: Si estoy trabajando en un script bash y quiero utilizar una variable del script en la expresión regular de perl, tengo que exportarla para convertirla en una variable de entorno:

export USUARIO

Una vez exportada, ya puedo usarla en la expresión regular haciendo referencia a ella de la siguiente manera: $ENV{'USUARIO'} Viéndolo en el ejemplo:

# rename 's/gestor/$ENV{'USUARIO'}/' /home/profesor/$USUARIO/.nautilus/metafiles/*

13 comentarios:

Pereyra Carlos dijo...

hola...muy bueno, me ayudo mcuho. he visto programitas graficos que hacen eso pero nunca como un buen comando de consola para hacer las cosas. gracias!!!

Esteban M. Navas dijo...

Cuando trabajas en Linux, es muy interesante conocer los comandos de consola. De este modo, puedes trabajar tanto cuando dispones de entorno gráfico como cuando no dispones de él, cosa habitual en servidores.

Anónimo dijo...

De hecho en servidores de trabajo, se acostumbra tener cantidades de masivas de archivos, y es muy útil la consola.
Por eso linux/UNIX funcionan tan bien en entornos de trabajo frente a Windows (entre otras cosas)
Para algunas cosas, los comandos son insustituibles.

Gomezjp dijo...

Hola, tengo un centos 6.4 y no me funciono el comando.

Esteban M. Navas Martín dijo...

¿Qué es lo que no te funcionó?

Berenice Sutara dijo...

Hola, a mi tampoco me funciono!! yo lo utilice en un scrip y no le cambia el nombre...

Berenice Sutara dijo...

Hola, a mi tampoco me funciono!! yo lo utilice en un scrip y no le cambia el nombre...

Esteban M. Navas Martín dijo...

Tendrás que analizar tu script para encontrar cuál es el problema.

marci cableado dijo...

OK, entiendo los ejemplos, pero podrias poner un link donde aprender mas sobre las expresiones en pearl,

por ejemplo, yo quiero añadir unos guiones al nombre del fichero:

de "20140716*.*"
a "2014-07-16*.*"


sabes como podria hacerlo ?

le pongo:
'y/"20140716*"/"2014-07-16*"/' *
y no se lo traga...

felicitaciones por el aporte y gracias de antemano !

Purroylg dijo...

Saludos hermano, Gracias por este post. aunque ha pasado muchisimo tiempo del mismo, hoy sigue siendo util.

Me gustaria aplicar este comando, para eliminar unas extenciones, pero en un directorio especifico.

Ejemplo: rename 's/\.vvv$//' *.vvv En la ruta "/Disco_1" a fin de que se eliminen las extenciones mencionadas dentro de esa unidad y todas las subcarppetas que existan.

a la espera de tus nuevas.

Esteban M. Navas Martín dijo...

Eso es fácil de hacer si aplicas el rename sobre un find:

find /Disco_1 -type f | rename 's/\.vvv//'

Esteban M. Navas Martín dijo...

Hola marci:

Entiendo que lo que quieres hacer es lo siguiente:

rename 's/20140716/2014\-07\-16/' *

Jose Luis Barrenechea dijo...

Muy buueno el post! Gracias!
Fotos descargadas del celular se llaman por ej. así: 20151213_180809.jpg
quiero que se llamen Calamuchita1, Calamuchita2, ...hasta Calamuchita99
$ rename -n y/\.jpg/Calamuchita/ *.jpg

Resultado:
Replacement list is longer than search list at (eval 1) line 1.
20151213_180809.jpg renamed as 20151213_180809Cala
Replacement list is longer than search list at (eval 2) line 1.
20151213_180919.jpg renamed as 20151213_180919Cala
Replacement list is longer than search list at (eval 3) line 1.
20151213_180944.jpg renamed as 20151213_180944Cala
y así sucesivamente

¿Me podrías decir cómo tendría que ser el comando?
Gracias anticipadas