Supongamos que tengo cinco archivos mp3:
01-trackfoo.mp3
02-trackbar.mp3
03-trackbaz.mp3
04-trackabc.mp3
05-trackxyz.mp3
Ahora escucho rápidamente los archivos (solo mplayer en la consola hará el truco) y descubro que las pistas están en el orden incorrecto . 05 es en realidad 02 y el resto deberá ser renombrado. Así que primero haré un cambio de nombre temporal:
01-trackfoo.mp3
02-trackbar.mp3
03-trackbaz.mp3
04-trackabc.mp3
00-trackxyz.mp3
Ahora necesitamos un "turno": 02 debería convertirse en 03, 03 debería convertirse en 04 y 04 debería convertirse en 05. Para minimizar la confusión, ex-05 (ahora 00) será mv
editado más tarde.
Mi enfoque fue este: (Perl rename
, por Larry Wall, predeterminado aquí en Debian)
rename 's/0([2-4])([\s\S]+)/0($1+1)$2/' *
así como (más tarde, después de un poco más de RTFM)
rename 's/0([2-4])([\s\S]+)/0($1+1)$2/e' *
Ninguno de ellos trabajó, sobre todo porque el /e[val]
modificador no acepta ninguna otra cosa , pero las evaluaciones, y generará un error una vez que se intenta combinar las evaluaciones con cuerdas. El bash
puede hacerlo bien, por ejemplo foo$((1+6))
, será evaluado foo7
.
Entonces, ¿cómo puedo hacer esto?
fuente
$'\x01'2
un cambio de nombre preliminar como este:prename 's/^05/\x012/' 05*
... entonces el[2-4]
cambio de nombre anterior ... entonces una finalprename 's/^\x01/0/' $'\x01'2*
hará el truco ... Eso hace 3 uno -liners ... Por un cuarto, y una comprobación inicial de la posible presencia de un archivo que comienza$'\x01'
, algo como este fragmento de bash lo atrapará ...shopt -s nullglob; x=($'\x01'*); [[ -n $x ]] && { echo '\x01' is not suitable; exit; }
Cuando las cosas se ponen tan complicadas, no veo ninguna razón para no escribir un guión. Nunca vas a recordar cómo hacer esto de una carrera a la siguiente, por lo que terminarás reinventándolo cada vez o envolviéndolo en un script de todos modos.
Para una cosa pequeña como esta, generalmente empiezo a tratar de resolverlo en Bash:
Básicamente, este script elimina todos los dígitos iniciales, luego coloca un número de serie creciente con relleno de cero en el frente, con los archivos numerados de acuerdo con el orden en que los pasa al script.
Lo hace en dos etapas, con
sertmp-
prefijos para la primera pasada para evitar cualquier riesgo de colisiones de nombres. Si llama a este scriptmp3-renamer
y lo llama así:te encuentras con una colisión trivial en el primer cambio de nombre si no usas 2 pases para cambiar el nombre. (
01-foo.mp3
->01-foo.mp3
.)Sin embargo, si lo llamas así:
accidentalmente borra
01-foo.mp3
en el primer cambio de nombre con un cambio de nombre de 1 pasada.Si el problema se complica, lo reescribiría en Perl. En ese punto, podría usar un hash para mantener la asignación de nombre antiguo-> nuevo, y usar un poco de código inteligente para calcular el orden correcto para hacer las rebajas para evitar la necesidad de 2 pases.
fuente