Verwenden Sie regex, um mehrere Dateinamen in Bulk File Renamer zu ändern (zu reorganisieren)

995
LincM

Ich habe ein paar tausend MP3-Dateien in Ordnern verschachtelt, die ich gerne umbenennen möchte.

Die Dateien haben derzeit die folgende Namenskonvention:

"tracknumber_artistname_-_songname_MP3COLLECTION.mp3" 

Zum Beispiel:

"01_Michael_Jackson_-_Wanna_Be_Startin'_Something_MP3COLLECTION.mp3" 

Ich möchte diese Dateien jedoch reorganisieren, indem Sie den Namen des Interpreten nach dem Namen des Songs verschieben, die Cruft am Ende entfernen und alle Unterstriche durch Leerzeichen ersetzen. Dies führt zu der obigen Konvention und dem folgenden Beispiel:

"tracknumber songname - artistname.mp3" "01 Wanna Be Startin' Something - Michael Jackson.mp3" 

Ich habe Bulk File Renamer, der Optionen für Regex gibt, aber ich weiß nicht, wie ich das anstellen soll. Irgendwelche Vorschläge? Ich bin auch offen für die Verwendung verschiedener Tools oder Methoden, wenn die Umbenennung von Bulk-Dateien nicht die beste Option ist.

Hinweis: Ich habe dies ursprünglich bei StackExchange veröffentlicht, aber es wurde mir empfohlen, dies hier zu veröffentlichen, da es dort kein Thema ist.

2

2 Antworten auf die Frage

1
SadBunny

In Windows? Ich kenne "Bulk File Renamer" nicht. Ich würde das "Multi Rename" -Tool von Total Commander verwenden. Besser noch, ich würde wahrscheinlich mit Perl oder Awk von einem Cygwin-Terminal aus arbeiten, um eine umfassendere Skriptlösung zu erhalten. Das würde hier allerdings zu weit gehen. Nur aus einer Regex-Perspektive, das funktioniert für mich in TC mit Ihrem Dateinamen (aber nur, wenn Dateien kein zusätzliches "-" oder "." In den Interpret- oder Songtitelfeldern enthalten), sollte wahrscheinlich in jedem Regex-unterstützenden Massenumbenennen funktionieren Werkzeug ohne allzu große Mühe, weil ich glaube, ich habe keine ausgefallenen fortgeschrittenen RegEx-Sachen verwendet, wie zB Posix-Zeichenklassen (": digit:" und so) ...

Wenn Sie TC verwenden, möchten Sie die Kontrollkästchen "[E]" und "RegEx" markieren und die anderen drei im Bereich "Suchen & Ersetzen" des Werkzeugs "Multi-Rename" deaktivieren. Ich habe das Ganze in TC selbst getestet. Bitte schätzen Sie die Zeit, die ich für Sie aufgewendet habe :) Wenn Sie ein anderes Tool verwenden und es nicht funktioniert, suchen Sie in der RegEx-bezogenen Hilfe nach "Rückreferenzen", da einige Tools andere Standards verwenden RegEx-Bacrefs. (Es sind die $ 1 $ 2 $ 3 usw. in meinem Code, die sich auf etwas beziehen, das bei der Suche in Klammern steht.)

HINWEIS Wenn Sie eine Massenumbenennung durchführen möchten, erstellen Sie zunächst eine Sicherungskopie Ihrer gesamten Sammlung. Man weiß nie. Ich bin nicht verantwortlich, bla bla.

FIRST: Trennen Sie das Trennzeichen in _ "_-_" anstelle des aktuellen "_". Denn "_-_" scheint ein nützliches Trennzeichen zu sein, das in normalen Texten nicht versehentlich vorkommt. Lassen Sie uns auch hier den Teil "_ " auslüften.

search for: (([0-9]+)_)(.*)_(.*)(\..*) replace with: $2_-_$3$5 

Hinweis: Dies setzt voraus, dass Sie die Dateierweiterung in den Umbenennungsprozess einschließen, und stellt sicher, dass Sie diese Erweiterung beibehalten, falls Sie auch über .ogg-Dateien oder was auch immer verfügen. Wenn Ihr Tool die Erweiterung nicht in den Umbenennungsprozess einbezieht, entfernen Sie das letzte "(\ .. *)" aus der Suche und die letzten 5 $ aus dem Ersetzen.

Ihr Name sieht jetzt folgendermaßen aus: 1 _-_ Michael_Jackson _-_ Wanna_Be_Startin'_Something.mp3

SECOND: Ersetzen Sie nun das erste Vorkommen von "_._" durch "" und das zweite durch "-":

search for: (.*?)_-_(.*?)_-_(.*)(\..*) replace with: $1 $2 - $3$4 

Hinweis: Wenn Ihr Tool die Dateierweiterung nicht in den Prozess einbezieht, entfernen Sie das letzte "(\ .. *)" aus der Suche und die letzten 4 $ aus dem Ersetzen.

Ihr Name sieht jetzt so aus: 1 Michael_Jackson - Wanna_Be_Startin'_Something.mp3

DRITTE UND LETZTE: Ersetzen Sie einfach "_" durch "".

Ihr Name sieht jetzt so aus: 1 Michael Jackson - Willst du anfangen? Etwas.mp3

Viel Glück!

/ edit: es ist etwas Präzision erforderlich, um sicherzustellen, dass alle diese Unterstriche in diesem Beitrag korrekt angezeigt werden :)

/ edit 2: Nach dem Nachdenken. Sie können die Titelnummern unter 10 (dh 0-9) auch mit einer 0 auffüllen, so dass Sie 01, 02, ..., 09, 10, 11 usw. erhalten wie Telefone oder MP3-Player, um Ihre Titel in der richtigen Reihenfolge abzuspielen. Dafür:

Search for: (^[0-9] ) Replace with: 0$1 
Das sieht nach einer hervorragenden Methode aus. Ich versuche es heute Abend und werde Sie wissen lassen. Ich habe hier TC auf meinem Computer installiert, habe aber keinen Zugriff auf die Dateien, die ich ändern muss, außer über FTP. Ich möchte meine Bandbreite nicht mit einer solchen Aufgabe abbauen. Ich sollte hinzufügen, dass die vorhandenen Dateinamen derzeit alle zweistellig aufgefüllt sind. Ich erwarte also nicht, dass ich die Auffüllung hinzufügen muss, es sei denn, etwas in dem früheren Regex wurde konfiguriert, um es zu entfernen, aber ich konnte es nicht (obwohl mit Mein begrenztes Wissen) sehe alles, was darauf hindeutet. LincM vor 9 Jahren 0
Alle meine regulären Ausdrücke hier sind mit 0-aufgefüllten Namen kompatibel und werden sie intakt lassen. (([0-9] +) _): Suche nach ((eine oder mehrere Ziffern) gefolgt von Unterstrich). SadBunny vor 9 Jahren 0
0
Xen2050

Mein erster Instinkt ist, nicht zu versuchen, ein Programm oder Skript dafür zu schreiben, sondern ein fertiges mp3-Umbenennungsprogramm zu verwenden, um dies für Sie zu tun. Es gibt verschiedene (von unterschiedlicher Qualität) für verschiedene Betriebssysteme.

Wenn Sie die Idee der Umbenennung nicht kennen, können Sie gnu-Tools (verfügbar in Linux / Unix / Mac oder Cygwin) wie sedoder awkoder oder tr& cut& -Variablen in einem Bash-Skript verwenden. Sie benötigen einen Standard So können Sie die Felder (Titel, Interpreten, Titel) in Ihren Dateinamen voneinander trennen, wenn Sie eine variable Anzahl von Leerzeichen zwischen ihnen verwenden, ohne dass ein Feldtrennzeichen gesetzt ist, wäre dies schwierig.

Hier ist eine sehr schnelle vorläufige awkZeile, die den eingehenden String trennt (nachdem _er in Leerzeichen übersetzt wurde ) und ihn in einer anderen Reihenfolge ausgibt. Sie müssen herausfinden, ob Sie die "Tracknummer" selbst am Anfang behalten:

$ jackstring="tracknumber_artistname-songname_MP3COLLECTION.mp3"  $ echo $jackstring  tracknumber_artistname-songname_MP3COLLECTION.mp3  $ echo "$jackstring"|tr -s "_" " "|awk -F'[-.]' ''  songname MP3COLLECTION-tracknumber artistname.mp3