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; }