Nehmen wir an, ich habe fünf MP3-Dateien:
01-trackfoo.mp3
02-trackbar.mp3
03-trackbaz.mp3
04-trackabc.mp3
05-trackxyz.mp3
Jetzt höre ich mir die Dateien kurz an (nur mplayer auf der Konsole reicht aus) und stelle fest, dass die Titel in der falschen Reihenfolge sind . 05 ist eigentlich 02 und der Rest muss umbenannt werden. Also werde ich zuerst eine temporäre Umbenennung durchführen:
01-trackfoo.mp3
02-trackbar.mp3
03-trackbaz.mp3
04-trackabc.mp3
00-trackxyz.mp3
Jetzt brauchen wir eine "Verschiebung": 02 sollte 03 werden, 03 sollte 04 werden und 04 sollte 05 werden. Um Verwirrung zu minimieren, wird ex-05 (jetzt 00) erst später mv
bearbeitet.
Mein Ansatz war folgender: (Perl rename
, von Larry Wall, Standard hier bei Debian)
rename 's/0([2-4])([\s\S]+)/0($1+1)$2/' *
sowie (später, nach etwas mehr RTFM'ing)
rename 's/0([2-4])([\s\S]+)/0($1+1)$2/e' *
Keiner von ihnen hat funktioniert, insbesondere weil der /e[val]
Modifikator nichts anderes als Auswertungen akzeptiert und einen Fehler auslöst, sobald Sie versuchen, die Auswertungen mit Zeichenfolgen zu kombinieren. Das bash
kann es ganz gut, zB foo$((1+6))
wird ausgewertet foo7
.
Wie kann ich das tun (einzeilig bevorzugt, nicht beabsichtigt, ein ganzes eigenständiges Skript nur dafür zu schreiben)?
quelle
$'\x01'2
einer vorläufigen Umbenennung wie dieser beginnen:prename 's/^05/\x012/' 05*
.. dann die obige[2-4]
Umbenennung .. dann reicht ein Finale ausprename 's/^\x01/0/' $'\x01'2*
.. Das macht 3 eins -liners ... Für eine vierte und eine erste Überprüfung auf das mögliche Vorhandensein einer Datei, die mit beginnt$'\x01'
, wird so etwas wie dieses Bash- Snippet esshopt -s nullglob; x=($'\x01'*); [[ -n $x ]] && { echo '\x01' is not suitable; exit; }
Wenn die Dinge so kompliziert werden, sehe ich keinen Grund, kein Skript zu schreiben. Sie werden sich nie daran erinnern, wie dies von einem Lauf zum nächsten zu tun ist, also werden Sie es entweder jedes Mal neu erfinden oder es trotzdem in ein Skript packen.
Für eine kleine Sache wie diese versuche ich im Allgemeinen, sie in Bash zu lösen:
Grundsätzlich entfernt dieses Skript alle führenden Ziffern und setzt dann eine mit Nullen aufgefüllte, zunehmende Seriennummer auf die Vorderseite, wobei die Dateien in der Reihenfolge nummeriert sind, in der Sie sie an das Skript übergeben.
Dies geschieht in zwei Schritten mit
sertmp-
Präfixen für den ersten Durchgang, um das Risiko von Namenskollisionen zu vermeiden. Wenn Sie dieses Skriptmp3-renamer
aufrufen und es wie folgt aufrufen:Beim ersten Umbenennen kommt es zu einer trivialen Kollision, wenn Sie für die Umbenennung nicht zwei Durchgänge verwenden. (
01-foo.mp3
->01-foo.mp3
.)Wenn Sie es aber so nennen:
Sie löschen versehentlich
01-foo.mp3
beim ersten Umbenennen mit einem 1-Pass-Umbenennen.Wenn das Problem komplizierter wird, würde ich es in Perl umschreiben. Zu diesem Zeitpunkt könnten Sie dann einen Hash verwenden, um die Zuordnung von alten und neuen Namen zu speichern, und mit ein wenig cleverem Code die richtige Reihenfolge für die Umbenennungen ermitteln, um die Notwendigkeit von zwei Durchgängen zu vermeiden.
quelle