Massenumbenennungsverzeichnisse, um das Jahr vom Ende zum Anfang zu verschieben

11

Ich habe derzeit Probleme mit einigen Musikordnern. Ich habe mich einmal entschlossen, sie nach dem Muster zu benennen : artist - album - year. Ich habe heute festgestellt, dass dies kein kluger Schachzug war, und möchte jetzt meine Verzeichnisse nach dem Muster benennen: year - artist - albumSie werden dann in aufsteigender Reihenfolge angezeigt, wenn sie aufgelistet werden.

Ich habe angefangen, die Umbenennung von Hand vorzunehmen, aber mit ungefähr 700 Ordnern muss es einen einfacheren Weg geben. Ich habe es versucht, gprenameaber ich bin nicht so gut in Regex und Bash-Skripten ...

Gibt es jemanden, der mir helfen könnte, meine armen Fingerspitzen zu schonen?

Einige Beispiele:

Aes Dana - Memory Shell - 2004 
Anja Schneider & GummiHz - Back To Back (Remixes Part 2) - 2009

würde werden

2004 - Aes Dana - Memory Shell
2009 - Anja Schneider & GummiHz - Back To Back (Remixes Part 2)

BEARBEITEN: Einige Künstler- und Albumnamen haben Sonderzeichen wie And.Idoder Kool & The Gang. Obwohl jedes Verzeichnis -als Trennzeichen hat.

TazMayhem
quelle
2
Bitte fügen Sie einige Beispielverzeichnisnamen und die erwartete Ausgabe hinzu.
Muru
Zum Beispiel: Ich habe "Aes Dana - Memory Shell - 2004" und ich möchte "2004 - Aes Dana - Memory Shell"
TazMayhem
1
Sie wissen, wie man die Frage bearbeitet. Warum fügen Sie das nicht zur Frage hinzu? Enthält auch ein Album oder ein Künstlername -?
Muru
Ist der Name per Definition durch das Trennzeichen "-" angeordnet und kommt er möglicherweise an anderer Stelle im Namen vor?
Jacob Vlijm
Ich neige dazu, die Quellordner in eine Textdatei umzuleiten und dann vim zu verwenden. Ich erstelle ein Makro, um einen zweiten Parameter für jede Zeile mit den relevanten Komponenten des Quellordners in der richtigen Reihenfolge zu erstellen, und verwende dann ein anderes Makro, um mv am Anfang jeder Zeile zu setzen. Ich könnte sogar so weit gehen, zuerst eine Kopie der Ordnerstruktur zu erstellen, falls ich ein Durcheinander von / verlorenen Ordnern gemacht habe.

Antworten:

16

Angenommen, Sie haben Zugriff auf Perl rename(allgemein verfügbar in Ubuntu - danke an @Serg für die Klärung des Unterschieds. Rufen /usr/bin/renameSie im Zweifelsfall an und Sie sollten das richtige erhalten), können Sie Folgendes verwenden:

rename -n 's/(.*) - (\d{4})\//$2 - $1/' */

-nNach dem Testen entfernen , um die Verzeichnisse tatsächlich umzubenennen. Dies setzt voraus, dass alle Alben zwischen 1000 und 9999 liegen. Wahrscheinlich vernünftig ...

Erläuterung

  • s/old/newersetzen olddurchnew
  • (.*)Speichern Sie eine beliebige Anzahl von Zeichen, auf die $1später verwiesen werden soll
  • (\d{4})\/Speichern Sie vier Ziffern am Ende der Zeile, um $2später darauf zu verweisen .
  • */ Alle Verzeichnisse abgleichen (keine Dateien - danke an @muru für die Hilfe!)
Zanna
quelle
3
Vielleicht */nur, um Verzeichnisse abzugleichen .
Muru
@muru es scheint nicht zu funktionieren! Was mache ich dumm?
Zanna
1
@ Zanna Ich denke, was sie meinen, ist die Tatsache, dass einige Muscheln wie mkshein eingebautes genannt haben rename. Es reicht aus, es durch einen vollständigen Pfad zu ersetzen oder prenamedie Perl-Umbenennung
anzurufen
1
@ Zanna Fand dieses interessante Stück: unix.stackexchange.com/a/229248/85039 TL; DR : Das renamewird nicht "manchmal genannt prename", aber anscheinend sind es zwei "Zweige" desselben Skripts, einer, der nicht gepflegt wird von Debian und dem anderen. Also ja. . . Es ist eine Menge Chaos - einige Shells haben ihre eigenen rename, Perl-Pakete haben ihre eigenen renameund Debian selbst bietet separate Pakete
Sergiy Kolodyazhnyy
1
@Zanna Ich dachte an das Programm, auf das rename.ulin unix.stackexchange.com/q/229230/21167 verwiesen wird
zwol
6

Ein einfaches Python-Skript kann folgende Aufgaben ausführen:

$ tree
.
├── Aes Dana - Memory Shell - 2004
├── Anja Schneider & GummiHz - Back To Back (Remixes Part 2) - 2009
└── rename_dirs.py

2 directories, 1 file
$ ./rename_dirs.py */
$ tree
.
├── 2004 - Aes Dana  -  Memory Shell 
├── 2009 - Anja Schneider & GummiHz  -  Back To Back (Remixes Part 2) 
└── rename_dirs.py

Skriptinhalt:

#!/usr/bin/env python
from shutil import move;
import sys

for i in sys.argv[1:] :
    parts = i[:-1].split('-')
    year = parts[-1].strip()
    new_name = year + " - " + " - ".join(parts[:-1]).strip()
    move(i,new_name)

So funktioniert das:

  • Der Haupttrick besteht darin, dass wir das Skript aus demselben Verzeichnis ausführen, in dem sich die Ziele befinden. Wir gehen auch vorbei*/ nur Verzeichnisse als Argumente für das Skript
  • Das Skript durchläuft alle Befehlszeilenargumente und unterteilt jeden Dateinamen in eine Liste von Zeichenfolgen unter - Zeichen. Der neue Dateiname besteht aus Teilen, die wir extrahiert haben.
  • move() Funktion von shutils Modul benennt die Verzeichnisse tatsächlich um

Beachten Sie die Verwendung: ./rename_dirs.py */

Sergiy Kolodyazhnyy
quelle