Hay preguntas similares sobre cómo agregar números con cero a la izquierda, etc., pero en mi caso mi nombre de archivo tiene dos números, que es el número de capítulo y el número de página. Ambos carecen del cero inicial, por lo que no están ordenados alfabéticamente. Usando rename o cualquier otro método, quiero convertir archivos como estos:

file_1_1.mp3  to file_01_01.mp3
file_1_12.mp3 to file_01_12.mp3
file_12_1.mp3 to file_12_01.mp3
...

Intenté esto:

rename 's/\d+/sprintf("%02d",$&)/e' *.mp3

Pero solo agrega cero al número del capítulo.

2
Ahmad 23 jun. 2020 a las 14:37

2 respuestas

La mejor respuesta

Así:

rename -n 's/(\d+)_(\d+)\./sprintf("%02d_%02d.", $1, $2)/e' *.mp3

Retire el interruptor -n cuando la salida se vea bien para usted

Salida

rename(file_1_12.mp3, file_01_12.mp3)
rename(file_1_1.mp3,  file_01_01.mp3)
rename(file_12_1.mp3, file_12_01.mp3)

cambiar el nombre del hombre

warning Hay otras herramientas con el mismo nombre que pueden o no poder hacer esto, así que ten cuidado.

El comando de cambio de nombre que forma parte del paquete util-linux, no lo hará.

Si ejecuta el siguiente comando (GNU)

$ rename

Y ves perlexpr, entonces esta parece ser la herramienta correcta.

Si no, para que sea el valor predeterminado (generalmente ya es el caso) en Debian y derivadas como Ubuntu:

$ sudo apt install rename
$ sudo update-alternatives --set rename /usr/bin/file-rename

Para archlinux:

pacman -S perl-rename

Para las distribuciones de la familia RedHat:

yum install prename

El paquete 'prename' está en el EPEL repositorio.


Para Gentoo:

emerge dev-perl/rename

Para * BSD:

pkg install gprename

O p5-File-Rename


Para usuarios de Mac:

brew install rename

Si no tiene este comando con otra distribución, busque su administrador de paquetes para instalarlo o hágalo manualmente (sin detalles ...)


Esta herramienta fue originalmente escrita por Larry Wall, el padre de Perl.

3
Gilles Quenot 23 jun. 2020 a las 14:56

Este script de shell funciona:

for file in *mp3
do
    new=$(echo "$file" | sed 's/_/_0/g; s/_0\([0-9][0-9]\)/_\1/g;');
    mv "$file" "$new";
done;
  • Agrega un 0 a cada guión bajo encontrado
  • Elimina ese 0 si resulta en al menos dígitos seguidos

Editar: se agregó la bandera lobal g al segundo comando s sustituto, por comentario de @PaulHodges

1
Bill Jetzer 23 jun. 2020 a las 17:12