Cambio de extensión masivamente (función)

Aquí además de ver varias formas de renombrar la extensión de varios ficheros de forma masiva y simple vamos a ver algunos conceptos interesantes, algunos ya vistos pero siempre está bien recordarlos y ver otras formas de aplicarlos.

Vamos a empezar por el comando rename (no disponible en Mac OS X, al menos no lo he encontrado, pero el source está aquí). Este comando sirve para renombrar fichero masivamente a partir de una expresión regular (formato Perl), su sintaxis es:

rename [ -v ] [ -n ] [ -f ] perlexpr [ files ]
 -v, --verbose  -> Verbose: muestra los nombres de los ficheros renombrados con éxito.
 -n, --no-act   -> No hace nada, solo muestra lo que renombraría.
 -f, --force    -> Fuerza, sobre escribe los ficheros destino que existan.
Como ejemplos, cambiar la extensión tar.gz por tgz (un poco estúpido pero es un ejemplo):
rename 's/.tar.gz$/.tgz/' *.tar.gz
NOTA: es importante escapar los "." ya que son parte de la expresión regular.

Otro ejemplo interesante aunque no tenga nada que ver con las extensiones es renombrar nombres de fichero que tengan mayúsculas a minúsculas:

rename 'y/A-Z/a-z/' *

Ahora vamos con un poco de código en Bash para crear un función propia (sacada de Shell-fu.org):

function chext(){
  local fname
  local new_ext="$1"
  shift
  IFS=$'n'
  for fname in $@
  do
    mv "$fname" "${fname%.*}.$new_ext"
  done
}

Esta función la colocamos en nuestro .bashrc y ya tenemos un comando nuevo que podemos usar de la siguientes formas:

1) chext nueva *.vieja
2) chext html `find ~ -iname "*.htm"`
3) find ~ -iname "*.htm" | xargs chext html
  1. cambiamos todo los ficheros con extensión  "vieja" y le ponemos la extensión "nueva".
  2. Cambiamos los ficheros .htm por .html, es decir, le añadimos una l al final.
  3. Lo mismo pero usando un find para encontrar todos los fichero .html de nuestra home de forma recursiva.

Creo que tanto el comando rename como la función nos da bastante juego para poder crear nuevos scripts más complejos.

Retro

Lugares

Redes

Sistemas

Varios