Mostrando entradas con la etiqueta renombrar. Mostrar todas las entradas
Mostrando entradas con la etiqueta renombrar. Mostrar todas las entradas

jueves, 24 de enero de 2013

Renaming multiple files with Perl's Regex power

(puedes leer esta publicación en español aquí)

Useful one-liner to rename multiple files using regular expressions:

perl -we '$regex = shift(@ARGV); $rep = shift(@ARGV); $rep =~ s/"/\\"/g; $rep = qq("$rep"); foreach (@ARGV) { if (/$regex/) { $ren = s/$regex/$rep/geer;  print qq(Renaming "$_"\n      to "$ren"\n); rename($_, $ren); }}' <pattern> <replacement> <files...>

Brought up because of the Programming Languages class at Coursera, whose videos are numbered without padding zeros, (p.e. "2 - 9 - Functions Formally (856).mp4"), messing up sort order in many programs (like VLC).

To fix it from our trusty Linux terminal, first we create an alias for neatness (which you can also save permanently in your ~/.bashrc):

alias renamregex='perl -we '\''$regex = shift(@ARGV); $rep = shift(@ARGV); $rep =~ s/"/\\"/g; $rep = qq("$rep"); foreach (@ARGV) { if (/$regex/) { $ren = s/$regex/$rep/geer;  print qq(Renaming "$_"\n      to "$ren"\n); rename($_, $ren); }}'\'

Then we  change to the directory with the videos, replacing mine with your own of course (or you can simply press F4 in Dolphin to open a terminal in it, if you use KDE):

cd "~/Documentos/Educación/Cursos en línea/Coursera UoW - Programming Languages/"

And we add an underscore to the video length (so the video name is the same as the subtitle):

renamregex '(\d)(\d\d\)\.mp4)' '$1_$2' *.mp4
Renaming "2 - 9 - Functions Formally (856).mp4"       to "2 - 9 - Functions Formally (8_56).mp4"
And then we rename all files, adding a zero to all the lone digits, except the last--we don't want to change the extension:

renamregex '(^|\D)(\d)(\D)' '${1}0$2$3' *
Renaming "2 - 9 - Functions Formally (8_56).mp4"      to "02 - 09 - Functions Formally (08_56).mp4"
As a goodie for using the best OS for developers, you can install all the programs required on the class with a single command (in Debian/Ubuntu and friends):
sudo apt-get install emacs24 smlnj sml-mode racket ruby libtcltk-ruby

Though SML mode requires a quick fix (to fix the "require: Constant symbol `:group' specified in defvar" error):

sudo perl -pi -e 's/^\(defvar :.*\n//' /usr/share/emacs/site-lisp/sml-mode/sml-compat.el
sudo emacs -batch -f batch-byte-compile  /usr/share/emacs2*/site-lisp/sml-mode/sml-compat.el

If you want to use Emacs instead of DrRacket, install Quack and Geiser with:
sudo apt-get install emacs-goodies-el

and for the latest Geiser:
wget http://ubuntu.wikimedia.org/ubuntu/pool/universe/g/geiser/geiser_0.4-1_all.deb
sudo dpkg -i geiser_0.4-1_all.deb
rm geiser_0.4-1_all.deb

(or you can just apt-get install geiser if you're already in Ubuntu Sausy or Debian Jessie).

And add to your ~/.emacs:

;; Improved scheme-mode for Racket
(require 'geiser-install)
(require 'quack)
(quack-install)




If you're in Windows, you'll have to install Perl and run something like:

cd "$HOME\Mis Documentos\Educación\Cursos en línea\Coursera UoW - Programming Languages\" 

perl -we '$regex = shift(@ARGV); $rep = shift(@ARGV); $rep =~ s/"/\\"/g; $rep = qq("$rep"); foreach (@ARGV) { if (/$regex/) { $ren = s/$regex/$rep/geer;  print qq(Renaming "$_"\n      to "$ren"\n); rename($_, $ren); }}'
'(\d)(\d\d\)\.mp4)' '$1_$2' *.mp4

perl -we '$regex = shift(@ARGV); $rep = shift(@ARGV); $rep =~ s/"/\\"/g; $rep = qq("$rep"); foreach (@ARGV) { if (/$regex/) { $ren = s/$regex/$rep/geer;  print qq(Renaming "$_"\n      to "$ren"\n); rename($_, $ren); }}' '(^|\D)(\d)(\D)' '${1}0$2$3' *.*

Though I haven't tried it.

Renombrando múltiples ficheros con el poder ExReg de Perl

Práctico comando para renombrar ficheros usando expresiones regulares:

perl -we '$regex = shift(@ARGV); $rep = shift(@ARGV); $rep =~ s/"/\\"/g; $rep = qq("$rep"); foreach (@ARGV) { if (/$regex/) { $ren = s/$regex/$rep/geer;  print qq(Renombrando "$_"\n          a "$ren"\n); rename($_, $ren); }}' <patrón> <reemplazo> <ficheros...>

Sacado a colación a propósito de el curso de Lenguajes de Programación en Coursera, cuyos videos están numerados sin cero de prefijo ("2 - 9 - Functions Formally (856).mp4"), por lo que son ordenados incorrectamente en la mayoría de los programas (como VLC).

Para arreglarlo en una terminal de Linux, primero creamos un alias para mayor legilibilidad (que también puedes guardar permanentemente en tu .bashrc):

alias renamregex='perl -we '\''$regex = shift(@ARGV); $rep = shift(@ARGV); $rep =~ s/"/\\"/g; $rep = qq("$rep"); foreach (@ARGV) { if (/$regex/) { $ren = s/$regex/$rep/geer;  print qq(Renombrando "$_"\n          a "$ren"\n); rename($_, $ren); }}'\'

Después cambiamos al directorio donde tenemos los videos, reemplazando mi directorio con el tuyo claro (también puedes simplemente presionar F4 en Dolphin para abrir una terminal en él, si usas KDE):

cd "~/Documentos/Educación/Cursos en línea/Coursera UoW - Programming Languages/"

Y añadimos un guión bajo a la duración (para que el nombre del video coincida con el del subtítulo):

renamregex '(\d)(\d\d\)\.mp4)' '$1_$2' *.mp4
Renombrando "2 - 9 - Functions Formally (856).mp4"
          a "2 - 9 - Functions Formally (8_56).mp4"
Para después renombrar todos los ficheros añadiendo un cero a todos los dígitos solitarios, excepto el último--no queremos cambiar la extensión:

renamregex '(^|\D)(\d)(\D)' '${1}0$2$3' *
Renombrando "2 - 9 - Functions Formally (8_56).mp4"
          a "02 - 09 - Functions Formally (08_56).mp4"
Como premio extra por usar el mejor SO para los desarrolladores, puedes instalar todos los programas del curso con un solo comando (para Debian/Ubuntu y amigos):

sudo apt-get install emacs24 smlnj sml-mode racket ruby libtcltk-ruby

Aunque el modo SML requiere un pequeño arreglo (para  prevenir el error "require: Constant symbol `:group' specified in defvar"):

sudo perl -pi -e 's/^\(defvar :.*\n//' /usr/share/emacs/site-lisp/sml-mode/sml-compat.el
sudo emacs -batch -f batch-byte-compile  /usr/share/emacs2*/site-lisp/sml-mode/sml-compat.el

Si quieres usar Emacs en lugar de DrRacket, instala Quack y Geiser con:
sudo apt-get install emacs-goodies-el

y para el último Geiser:
wget http://ubuntu.wikimedia.org/ubuntu/pool/universe/g/geiser/geiser_0.4-1_all.deb
sudo dpkg -i geiser_0.4-1_all.deb
rm geiser_0.4-1_all.deb

(o si ya usas Ubuntu Sausy o Debian Jessie, puedes simplemente hacer apt-get install geiser).

y añade a tu ~/.emacs:

;; Improved scheme-mode for Racket
(require 'geiser-install)
(require 'quack)
(quack-install)



Si estás en Windows, tendrás que instalar Perl por tu cuenta y ejecutar algo como:

cd "$HOME\Mis Documentos\Educación\Cursos en línea\Coursera UoW - Programming Languages\" 

perl -we '$regex = shift(@ARGV); $rep = shift(@ARGV); $rep =~ s/"/\\"/g; $rep = qq("$rep"); foreach (@ARGV) { if (/$regex/) { $ren = s/$regex/$rep/geer;  print qq(Renombrando "$_"\n          a "$ren"\n); rename($_, $ren); }}'
'(\d)(\d\d\)\.mp4)' '$1_$2' *.mp4

perl -we '$regex = shift(@ARGV); $rep = shift(@ARGV); $rep =~ s/"/\\"/g; $rep = qq("$rep"); foreach (@ARGV) { if (/$regex/) { $ren = s/$regex/$rep/geer;  print qq(Renombrando "$_"\n          a "$ren"\n); rename($_, $ren); }}' '(^|\D)(\d)(\D)' '${1}0$2$3' *.*

Pero no lo he probado.