Páginas

viernes, 22 de septiembre de 2017

Como Renombrar Masivamente Archivos: Ejemplos de uso de RENAME




Como Renombrar Masivamente Archivos: Ejemplos de uso de RENAME






Renombrar un archivo es sencillo... pero cuando se trata de renombrar cientos.... la cosa varia. El uso del comando rename y de expresiones regulares nos sirven para simplificar dicha tarea.
"Una simple linea de comando puede conseguir en varios segundos el mismo resultado que haríamos manualmente en horas."

La sintaxis del comando rename es:

rename perlexpr [archivos]

Dónde:
  • perlexpr es una expresión regular en lenguaje Perl. (ver *)
  • [archivos] es la lista de archivos a los que afectará el comando.
Nota: 
Existen entornos gráficos de este comando (pyrenamer) pero muchas veces no tenemos acceso a entorno gráfico, y la terminal siempre la podemos usar, por ejemplo en entornos online de linux (ejemplo en c9.io) o cuando estamos trabajando directamente con servidores.
pyrenamer: entorno gráfico para el comando rename

Os dejo varios ejemplos explicados:
1) Queremos cambiar la extensión de los archivos .txt del directorio actual por .csv

$rename 's/\.txt/\.csv/' *.txt

Explicación:

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

       Nota: el caracter especial ".", se indica con "\."


2) Queremos añadir al principio del nombre de todos los ficheros .PDF el texto "01.03.Planos.":

$rename 's/^/01.03.Planos./' *.pdf

Explicación:

  • 's/^/01.03.Planos./'  es la expresión regular que dice "al principio pon el texto 01.03.Planos."
  • *.pdf es la lista de archivos a los que hay que aplicarles el cambio.

3) Queremos sustituir los espacios de los nombres por el caracter guión bajo, osea " " cambiar a "_" de los archivos .PDF
$rename 'y/\ /_/' *.pdf 

Explicación:

  • 'y/\ /_/'  es la expresión regular que dice "cuando aparezca un espacio sustitúyelo por un guion bajo _"
  • *.pdf es la lista de archivos a los que hay que aplicarles el cambio.

4) Queremos quitar el contenido que este entre parentesis de los nombes de los ficheros, incluido el propio parentesis. Por ejemplo "hola(1).txt" renombrarlo a "hola.txt"

$rename 's/\(.*\)//g' *

Explicación:
  • 's/\(.*\)//g'  es la expresión regular que dice "elimina el contenido entre parentesis incluido los parantesis"
  • * a todos los ficheros
5) Tenemos varios archivos con este  formato  de nombre: "Audio XX-Pista de audio By hola.mp3", siendo XX el numero de la canción. Se desea eliminar del nombre la parte de "Audio " y " By hola"

$rename 's/Audio //g' *.mp3
$rename 's/ By hola//g' *.mp3

Explicación:
  • Aplicamos 2 veces el comando, una para eliminar la palabra "Audio " y otra para eliminar " By hola"
  • 's/Audio //g' eliminamos la palabra "Audio "
  • 's/ By hola//g' eliminamos las palabras " By hola"
  • *.mp3: Aplicamos a todos los ficheros .mp3
http://mercurio.ugr.es/pedro/tutoriales/cursos/perl/expresiones.htm


(*) Extra:

Construyendo expresiones regulares complejas:


.cualquier caracter salvo el de retorno de carro
^indica que coincida al principio de la línea
$indica que coincida al final de la línea
*aparezca 0 o más veces el caracter que lo precede
+aparezca 1 o más veces el caracter que lo precede
?aparezca 0 o 1 veces el caracter que lo precede
[]indica un conjunto de caracteres que pueden aparecer
[^]indica un conjunto de caracteres que no pueden aparecer
|indica una disyunción, aparezca una de las opciones
()agrupa una serie de patrones en un simple elemento
{n}que coincida exactamente n veces
{n,}que coincida al menos n veces
{n,m}que coincida al menos n veces y no mas de m
\nun retorno de línea
\tun tabulador
\wun caracter alfanumérico (equivale a [a-zA-Z0-9_])
\Wun caracter no alfanumérico (equivale a [^a-zA-Z0-9_])
\dun caracter numérico (equivale a [0-9])
\Dun caracter no numérico (equivale a [^0-9])
\sun caracter de espaciado (espacio, tabulador, nueva línea, etc)
\Sun caracter NO de espaciado
\bcoincida con los límites de una palabra
\Bcoincida con el interior de una palabra
\033un número octal (el 033)
\x1bun número hexadecimal (el 1B)
\| \[ \] \( \) \* \^ \/ \\ etcrepresentan | [ ] ( ) * / \ (hay que escapar estos caracteres especiales)


Veamos algunos ejemplos ilustrativos:
d.luna "d" seguida de un caracter cualquiera y una "l" (del, dal, dzl, d5l, etc)
^funa "f" al principio de la cadena (fofo, farfolla, f35, etc)
^hol"hola" al principio de la cadena (hola, holita, etc)
e$una "e" al final de la cadena (este, ese, etc)
te$"te" al final de la cadena (este, paquete, etc)
ind*"in" seguido de cero o más caracteres "d" (in, ind, indd, etc)
.*cualquier cadena, sin retorno de carro
^$una cadena vacia
[qjk]una "q", o una "j" o una "k"
[^qjk]no sea "q", o una "j" o una "k"
[a-z]cualquier letra entre la "a" y la "z"
[^a-z]no sean letras minúsculas
[a-zA-Z]una letra minúscula o mayúscula
[a-z]+una secuencia no vacia de letras minúsculas
f.*cacoincide con p.e. "fca", "foca", "flaca", "flor vaca", etc
f.+cacoincide con los anteriores salvo con "fca"
fe?acoincide con "fa" y "fea"
^[ \t]*$una linea en blanco, o combinaciones de espacios y tabuladores
[-+]?\d*\.?\d*lo mismo que [-+]?[0-9]*\.?[0-9]* (números decimales)
( (\d{1,2})\/(\d{1,2})\/(\d{1,4}) )una fecha en el siguiente formato DD/MM/AAAA (13/02/1674 ó 8/2/23 pero también 99/99/9999)
pepe|juano "pepe" o "juan"
(pe|hue)coso "pecos" o "huecos"
(da)+o da o dada o dadada ...
[01]un "0" o un "1"
\/0una división por 0
\/ 0una división por 0 con un espacio
\/\s0una división por 0 con un caracter de espacio (espacio, tabulador, retorno de carro)
\/ *0una división por 0 con varios espacios
\/\s*0una división por 0 con posibles caracteres de espaciado
\/\s*0\.0*una división por 0 con posibles caracteres espaciado y acepta "0." "0.0" "0.00" etc
fia|fea|fuacoincida con "fia", "fea" o "fua"
f(i|e|u)acoincida con "fia", "fea" o "fua"
(fia|fea|fua)equivale a los dos anteriores
[fia|fea|fua]equivale a [fiaeu]