Supposons que j'ai cinq fichiers mp3:
01-trackfoo.mp3
02-trackbar.mp3
03-trackbaz.mp3
04-trackabc.mp3
05-trackxyz.mp3
Maintenant, j'écoute rapidement les fichiers (juste mplayer sur la console fera l'affaire) et je découvre que les pistes sont dans le mauvais ordre . 05 est en fait 02 et le reste devra être renommé. Donc, je vais d'abord faire un changement de nom temporaire:
01-trackfoo.mp3
02-trackbar.mp3
03-trackbaz.mp3
04-trackabc.mp3
00-trackxyz.mp3
Maintenant nous avons besoin d'un "shift": 02 devrait devenir 03, 03 devrait devenir 04 et 04 devrait devenir 05. Pour minimiser la confusion, ex-05 (maintenant 00) sera mv
édité plus tard.
Mon approche était la suivante: (perl rename
, par Larry Wall, par défaut ici sur Debian)
rename 's/0([2-4])([\s\S]+)/0($1+1)$2/' *
ainsi que (plus tard, après quelques RTFM supplémentaires)
rename 's/0([2-4])([\s\S]+)/0($1+1)$2/e' *
Aucun d'entre eux n'a fonctionné, en particulier parce que le /e[val]
modificateur n'accepte rien d'autre que des évaluations et générera une erreur une fois que vous tenterez de combiner les évaluations avec des chaînes. Le bash
peut le faire très bien, par exemple foo$((1+6))
sera évalué foo7
.
Alors, comment puis-je faire cela (une ligne de préférence, sans avoir l'intention d'écrire un script autonome juste pour cela)?
la source
$'\x01'2
alors un renommage préliminaire comme celui-ci:prename 's/^05/\x012/' 05*
.. puis le[2-4]
renommer ci-dessus .. alors une finaleprename 's/^\x01/0/' $'\x01'2*
fera l'affaire .. Cela fait 3 un -liners ... Pour un quatrième, et une première vérification de la présence éventuelle d'un fichier commençant par$'\x01'
, quelque chose comme cet extrait de bash leshopt -s nullglob; x=($'\x01'*); [[ -n $x ]] && { echo '\x01' is not suitable; exit; }
Quand les choses deviennent si compliquées, je ne vois aucune raison de ne pas écrire de script. Vous ne vous souviendrez jamais de la façon de procéder d'une exécution à l'autre, vous finirez donc par la réinventer à chaque fois, ou tout de même dans un script.
Pour une petite chose comme ça, je commence généralement à essayer de le résoudre dans Bash:
Fondamentalement, ce script supprime tous les premiers chiffres, puis met un numéro de série croissant à zéro au recto, avec les fichiers numérotés selon l'ordre dans lequel vous les passez au script.
Il le fait en deux étapes, avec des
sertmp-
préfixes pour la première passe pour éviter tout risque de collision de noms. Si vous appelez ce scriptmp3-renamer
et l'appelez comme:vous rencontrez une collision triviale lors du premier changement de nom si vous n'utilisez pas 2 passes pour effectuer le changement de nom. (
01-foo.mp3
->01-foo.mp3
.)Si vous l'appelez comme ceci, cependant:
vous effacez accidentellement
01-foo.mp3
lors du premier changement de nom avec un changement de nom en 1 passe.Si le problème devient plus compliqué, je le réécrirais en Perl. À ce stade, vous pouvez ensuite utiliser un hachage pour conserver le mappage de nom ancien-> nouveau, et utiliser un peu de code intelligent pour déterminer l'ordre approprié pour les renommer afin d'éviter la nécessité de 2 passes.
la source