koreafuro
Goto Top

BATch?-Dateiumbenennung mit jeweiligem NamensPräfix aus TXT-File-Zeile abhängig vom ursprünglichen Dateiname

Die Zahlen, mit denen die ursprünglichen Dateinamen beginnen und die auf die jeweilige Zeile mit dem Namenspräfix in dem TXT-File "verweisen", sind durch einen Bindestrich vom restlichen Dateinamen getrennt.

Hallo liebe "Computer-Wissende",

ich habe MS Windows XP SP2 auf meinem MEDION-Notebook (2GHz, 1024MB-RAM) mit dem "standardmäßigen" Editor.

Noch nie habe ich im Editor eine BATch-Datei geschrieben und suche daher nach dem kompletten Code um die gleich beschriebene Aufgabe zu erledigen.

Dass ich glaube, das Problem mit einem BATch-File lösen zu können, liegt an den "Ideen aus dem Netz", die ich bisher nach Recherche zu diesem Thema gefunden habe.


DIE AUFGABE/ DAS PROBLEM:

Exakt 6.997 JPG-Bilddateien in einem Verzeichnis möchte ich umbenennen. Die Dateinamen lauten momentan "auf folgendes Schema":
001-01.jpg
001-02.jpg
001-03.jpg
001-04.jpg
001-05.jpg
001-06.jpg
001-07.jpg
001-08.jpg
001-09.jpg
001-10.jpg
001-11.jpg
001-12.jpg
001-13.jpg
001-14.jpg
001-15.jpg
002-01.jpg
002-02.jpg
002-03.jpg
002-04.jpg
002-05.jpg
002-06.jpg
002-07.jpg
002-08.jpg
002-09.jpg
002-10.jpg
002-11.jpg
002-12.jpg
... ("usw. bis")
478-15.jpg

Zusätzlich habe ich eine Textdatei namens Namen.txt, die aus 478 Zeilen besteht, welche Einträge wie folgt enthalten:
00a831 ("Zeile 1")
01dfe3 ("Zeile 2")
024c0c ("Zeile 3")
... ("etc. bis")
ffbbb3 ("Zeile 478")

Die Zeileneinträge im TXT-File Namen.txt sind "von oben nach unten" alphabetisch sortiert und sind jeweils das Namenspräfix für die Dateiumbenennung.

Denn die dreistelligen Zahlen vor dem Bindestrich, mit denen die bisherigen Dateinamen beginnen, "verweisen" auf die jeweilige Zeile in der Textdatei Namen.txt. Diese dreistellige Zahl vor dem Bindestrich im Namen der JPG-Dateien soll durch den jeweiligen Zeileneintrag aus Namen.txt ersetzt werden.

So sollen bei der BATch-Umbenennung die Dateinamen der Bilddateien wie folgt umbenannt werden ("Dateiname vor Umbenennung -> Dateiname nach Umbenennung"):
001-01.jpg -> 00a831-01.jpg
001-02.jpg -> 00a831-02.jpg
001-03.jpg -> 00a831-03.jpg
001-04.jpg -> 00a831-04.jpg
001-05.jpg -> 00a831-05.jpg
001-06.jpg -> 00a831-06.jpg
001-07.jpg -> 00a831-07.jpg
001-08.jpg -> 00a831-08.jpg
001-09.jpg -> 00a831-09.jpg
001-10.jpg -> 00a831-10.jpg
001-11.jpg -> 00a831-11.jpg
001-12.jpg -> 00a831-12.jpg
001-13.jpg -> 00a831-13.jpg
001-14.jpg -> 00a831-14.jpg
001-15.jpg -> 00a831-15.jpg
002-01.jpg -> 01dfe3-01.jpg
002-02.jpg -> 01dfe3-02.jpg
002-03.jpg -> 01dfe3-03.jpg
002-04.jpg -> 01dfe3-04.jpg
002-05.jpg -> 01dfe3-05.jpg
002-06.jpg -> 01dfe3-06.jpg
002-07.jpg -> 01dfe3-07.jpg
002-08.jpg -> 01dfe3-08.jpg
002-09.jpg -> 01dfe3-09.jpg
002-10.jpg -> 01dfe3-10.jpg
002-11.jpg -> 01dfe3-11.jpg
002-12.jpg -> 01dfe3-12.jpg
... ("usw. bis")
478-15.jpg -> ffbbb3-15.jpg


Normaler Weise benutze ich Rename-Tools zum "schematischen Umbenennen" größerer Dateimengen. Doch ich kenne kein Rename-Tool, welches die neuen Dateinamen aus einem Textfile auslesen kann bzw. obige Aufgabe irgendwie erledigen kann. Kennt vielleicht Ihr eines?

An sich ist das von mir beschriebene Problem doch für einen Computer recht leicht zu lösen, oder?

Daher glaube ich eben, dass die Umbenennung wie beschrieben mit Hilfe einer BATch-Datei möglich ist. Doch leider habe ich, wie gesagt, noch nie eine BATch-Datei im Editor geschrieben. Darum wäre es eine große Hilfe und sehr nett, wenn mir jemand, der sowas kann, den kompletten "BATch-Code" hier posten würde (also alle Zeilen inkl. "@echo off" usw.), den ich dann "copy-pasten" könnte.

Damit meine ich, dass ich den "BATch-Code" dann in ein Editor-Fenster einfügen könnte und das ganze dann z.B. als renBAT.cmd im Ordner mit den 6.997 JPG-Bilddateien abspeichern könnte.

Doch wie führt man eine "BATch-Operation" durch? Muss ich dazu ein "DOS-Eingabefenster" öffnen und dann in das Verzeichnis mit den Bilddateien und renBAT.cmd gehen? Und wie lautet dann der "DOS-Befehl" um die Umbenennung durchzuführen?
Oder reicht vielleicht gar ein Doppelklick auf renBAT.cmd im MS Datei-Explorer?

An meinem Fragen erkennt Ihr meine mangelnde Erfahrung.^^ Deshalb wäre es natürlich super, wenn mir jemand neben dem "BATch-Code" auch ein paar erklärende Kommentare posten würde; z.B., was die einzelnen Einträge im "BATch-Code" bedeuten und bewirken.

Denn man lernt ja nie aus und diese für mich neuen Möglichkeiten interessieren mich sehr, auch um zukünftig ähnliche Probleme selbst lösen zu können!

Falls ich aber mit meiner detaillierten Frage hier zuviel erwartet haben sollte, wäre ich auch dankbar für Tipps und Links, die mir dabei helfen könnten, schnell "alleine" in das Thema "BATch-Umbenennung" rein zu kommen und den Code irgendwann selbst schreiben zu können.

Über Antwort(en) freue ich mich auf alle Fälle - Vielen Dank dafür schonmal vorab!

Gruß
Thilo

Content-ID: 61645

Url: https://administrator.de/contentid/61645

Ausgedruckt am: 25.11.2024 um 13:11 Uhr

13100
13100 18.06.2007 um 14:43:11 Uhr
Goto Top
für dich sollte insbesondere der for befehl interessant sein, also einfach mal im eingabefenster for /? eingeben und einlesen.

anschliessend bei unklarheiten einfach hier weiter lesen:

Batch for Runaways - Part2
Batch for Runaways - Part3
bastla
bastla 18.06.2007 um 14:46:09 Uhr
Goto Top
Hallo KoreaFuro und willkommen im Forum!

Oder reicht vielleicht gar ein Doppelklick auf renBAT.cmd im MS Datei-Explorer?
Ja, wenn die "renBAT.cmd" im gleichen Ordner wie die umzubenennenden Dateien und die "Namen.txt" liegt.

Der Inhalt der "renBAT.cmd" sollte so aussehen:
@echo off & setlocal
cd /d %~dp0
set /a Nr=1001
for /f %%i in (Namen.txt) do call :ProcessLine "%%i"  
goto :eof
:ProcessLine
for /f "tokens=1* delims=-" %%f in ('dir /b %Nr:~-3%*.jpg') do <b>echo</b> ren %%f-%%g %~1-%%g  
set /a Nr+=1
pause
Auch wenn ich davon ausgehe, dass eine Sicherungskopie der fraglichen Dateien existiert, habe ich dennoch als Vorsichtsmaßnahme zunächst noch ein "echo" vor den eigentlichen "ren"-Befehl gesetzt - damit wird jeweils nur angezeigt, was der Befehl ohne das "echo" davor bewirken würde (und nach Entfernen des "echo" auch wird).

Um diese Anzeige auch lesen zu können, ist eine "pause"-Zeile enthalten, die im Ernstfall natürlich zu entfernen wäre, um einen flüssigen Ablauf ohne das Erfordernis weiterer Aktivitäten Deinerseits zu gewährleisten.

Vorzeitig beenden lässt sich der Ablauf der Batch-Datei übrigens mit der Tastenkombination "Strg"-"C" und einer nachfolgenden Bestätigung des Abbruchswunsches.

Grüße
bastla

P.S.: Die Kommentare folgen etwas später ...
bastla
bastla 18.06.2007 um 16:13:25 Uhr
Goto Top
Hallo KoreaFuro!

Wie versprochen die erläuternden Kommentare:

@echo off & setlocal
Vorauseilende Anzeige des auszuführenden Befehles unterbinden und Geltungsbereich der eingesetzten Variablen mangels globaler Bedeutung auf diese BATch-Datei beschränken.

cd /d %~dp0
Da die BATch-Datei über den Explorer gestartet werden soll, durch Aufsuchen des die BATch-Datei (repräsentiert durch %0) enthaltenden Laufwerkes ("d" für "drive") und Ordners ("p" für "path") sicher stellen, dass die zu bearbeitenden Dateien ohne zusätzliche Angabe eines Pfades gefunden werden.

set /a Nr=1001
Initialisieren einer Zählervariable, deren letzte 3 Stellen als laufende Nummern der vorhandenen Dateien Verwendung finden werden - der Startwert 1001 löst das Problem der führenden Nullen.

for /f %%i in (Namen.txt) do call :ProcessLine "%%i"  
Schleife, welche TXT-File-Zeilen einzeln aus der "Namen.txt" liest und den Inhalt der jeweiligen Zeile - aus Sicherheitsgründen in Anführungszeichen verpackt - anlässlich des Aufrufes des eigentlichen Bearbeitungsunterprogrammes selbigem übergibt.

goto :eof
An dieser Stelle kann der Programmablauf nach Bearbeitung der letzten gelesenen Zeile durch Sprung zur imaginären Markierung "eof" (für "end of file") beendet werden.

:ProcessLine
Kennzeichnung des Beginns des Bearbeitungsunterprogrammes für den Inhalt einer gelesenen Zeile.

for /f "tokens=1* delims=-" %%f in ('dir /b %Nr:~-3%*.jpg') do echo ren %%f-%%g %~1-%%g  
Schleife, um alle mit der aktuellen Zeilennummer (= letzte 3 Stellen der Variablen %Nr% - daher mit führenden Nullen) beginnenden und auf ".jpg" endenden Dateinamen ohne entbehrliche Zusatzinformationen aufzulisten ("dir /b") sowie in die Teile ("tokens") vor und nach dem trennenden ("delimiting") "-" aufzuspalten. Die beiden Dateinamensbestandteile sind in weiterer Folge als %%f und %%g aufrufbar.

Für jede gefundene Datei wird durch "ren" der Umbenennungsprozess durchgeführt, wobei der ursprünglich vor dem "-" stehende Namensbestandteil %%f zugunsten des dem Unterprogramm als erstes (%1) Argument übergebenen Zeileninhaltes des TXT-Files verworfen wird. Der dem "-" folgende zweite Namensbestandteil (in %%g gespeichert) wird hingegen weiter verwendet. Da das "-" als Trennzeichen interpretiert wurde, ist dieses nun wieder explizit hinzuzufügen.

Die Schreibweise %~1 bewirkt das "Herausschälen" des neuen Präfixes aus den beim Aufruf des Bearbeitungsunterprogrammes hinzugefügten Anführungszeichen.

Die Funktion und Wirkungsweise des (seiner Bestimmung entsprechend nur temporär) enthaltenen "echo" wurde bereits an anderer Stelle erläutert.

set /a Nr+=1
Nach durchgeführter Umbenennung der zur jeweiligen Zeile gehörigen ".jpg"-Dateien kann die nächste Zeile in Angriff genommen werden - behufs dessen wird die Zeilennummer um 1 erhöht.

pause
(Nur zu Testzwecken verwendete) Unterbrechung des Programmablaufes (bis zum Drücken einer beliebigen Taste).

Quellen: Hilfe (Aufruf aus einem "DOS-Eingabefenster" durch Anfügen von/?an den jeweiligen Befehl oder mittels help Befehl) zu ECHO, SETLOCAL, CD, CALL, SET, FOR, GOTO, DIR, REN und PAUSE.

Grüße
bastla
KoreaFuro
KoreaFuro 18.06.2007 um 18:12:31 Uhr
Goto Top
Hallo Angeldust und bastla,

vielen herzlichen Dank - vor allem bastla für den Code und die ausführliche Beschreibung!

Zu Testzwecken hatte ich zunächst mit Deinem Code, bastla, die Datei "renBAT.cmd" erstellt und im Ordner "test" zusammen mit Kopien der Dateien "Namen.txt" und "001-*.jpg, 239-*jpg, 478-*.jpg" gespeichert. Der Doppelklick auf "renBAT.cmd" führte zu dem, was Du beschrieben hattest (echo, pause usw.).

Dann habe ich den Code wie folgt geändert:
---
@echo off & setlocal
cd /d %~dp0
set /a Nr=1001
for /f %%i in (Namen.txt) do call :ProcessLine "%%i"
goto :eof
:ProcessLine
for /f "tokens=1* delims=-" %%f in ('dir /b %Nr:~-3%*.jpg') do ren %%f-%%g %~1-%%g
set /a Nr+=1
---

Komischer Weise funktionierte das aber dann nicht richtig mit den "001-*.jpg" Dateien, weil von diesen nur die ersten 4 richtig geändert wurden und die anderen falsche Präfixnamen bekamen:
001-01.jpg -> 00a831-01.jpg (Präfix aus Zeile 1 in Namen.txt: ok)
001-02.jpg -> 00a831-02.jpg ( " )
001-03.jpg -> 00a831-03.jpg ( " )
001-04.jpg -> 00a831-04.jpg ( " )
001-05.jpg -> 7b670c-05.jpg (Präfix aus Zeile 238 in Namen.txt: Fehler!)
001-06.jpg -> 7b670c-06.jpg ( " )
001-07.jpg -> 7b670c-07.jpg ( " )
001-08.jpg -> 7b670c-08.jpg ( " )
001-09.jpg -> 7b229a-09.jpg (Präfix aus Zeile 236 in Namen.txt: Fehler!)
001-10.jpg -> 7b229a-10.jpg ( " )
001-11.jpg -> 7b229a-11.jpg ( " )
001-12.jpg -> 7b229a-12.jpg ( " )
001-13.jpg -> 7b229a-13.jpg ( " )
001-14.jpg -> 7b229a-14.jpg ( " )
001-15.jpg -> 7b229a-15.jpg ( " )

Die "239-*.jpg" und "478-*.jpg" Dateien wurden hingegen korrekt umbenannt.

Daraufhin testete ich das Ganze mit Kopien der Dateien "001-*.jpg" bis "100-*.jpg" (1.480 Bilddateien insgesamt). Dabei kam im DOS-Fenster öfters die Fehlermeldung, dass die Datei schon existiere. Bemerkenswert ist aber, dass bei diesem Testlauf alle "001-*.jpg" Dateien richtig umbenannt wurden. Andere hingegen leider nicht, so z.B. einige "030-*.jpg" Dateien:
030-01.jpg -> 11bc13-01.jpg (Präfix aus Zeile 1 in Namen.txt: ok)
030-02.jpg -> 11bc13-02.jpg ( " )
030-03.jpg -> 11bc13-03.jpg ( " )
030-04.jpg -> 11bc13-04.jpg ( " )
030-05.jpg -> e6ef7a-05.jpg (Präfix aus Zeile 432 in Namen.txt: Fehler!)
030-06.jpg -> e6ef7a-06.jpg ( " )
030-07.jpg -> e6ef7a-07.jpg ( " )
030-08.jpg -> e6ef7a-08.jpg ( " )
030-09.jpg -> e6ef7a-09.jpg ( " )
030-10.jpg -> e6ef7a-10.jpg ( " )
030-11.jpg -> e6ef7a-11.jpg ( " )
030-12.jpg -> e6ef7a-12.jpg ( " )
030-13.jpg -> e6ef7a-13.jpg ( " )
030-14.jpg -> e6ef7a-14.jpg ( " )
030-15.jpg -> e6ef7a-15.jpg ( " )
030-16.jpg -> e6ef7a-16.jpg ( " )

Trotz der guten Beschreibung, habe ich keine Ahnung, wodurch es zu diesen Fehlern kommen kann. Zuerst dachte ich, dass es an den Vornullen liegen könnte, weshalb ich eben 001 bis 100 getestet habe. Aber daran liegt es wohl nicht und ich verstehe den 'zweifachen' (bei den "030-*.jpg" Dateien) bzw. 'dreifachen Zeilensprung' bei den "001-*.jpg" Dateien nicht.

Was habe ich falsch gemacht und was muss ich für einen korrrekten Durchlauf ändern?

Gruß
Thilo
bastla
bastla 18.06.2007 um 19:33:26 Uhr
Goto Top
Hallo KoreaFuro!

Zumindest ein Detail (Suchmuster der Dateien mit "-", also %Nr:~-3%-*.jpg) solltest Du vorweg ändern und testen - verwende dazu bitte gleich die folgende "for"-Zeile (welche auch noch einige zusätzliche Anführungszeichen enthält):
for /f "tokens=1* delims=-" %%f in ('dir /b "%Nr:~-3%-*.jpg"') do echo ren "%%f-%%g" "%~1-%%g">>Ergebnis.txt  
Mit dieser Zeile wird, wie vorher, nur der Befehl zum Umbenennen erstellt, dieses Mal aber in einer "Ergebnis.txt" festgehalten. Kontrolliere diese bitte nach einem ersten Durchlauf. Sollten wieder Fehler aufgetreten sein, benenne diese Datei um und führe einen weiteren Testlauf durch, um feststellen zu können, ob der Fehler reproduzierbar ist.

Grüße
bastla
KoreaFuro
KoreaFuro 18.06.2007 um 22:37:49 Uhr
Goto Top
Hallo bastla,

super, Du bist echt genial! Auf die "fehlenden Anführungszeichen" wäre ich so schnell nicht als "Fehlerursache" gekommen - Vielen Dank, es hat jetzt bestens funktioniert! (^_^)

Zunächst habe ich die "for"-Zeile mit Deinen Änderungen in "renBAT.cmd" ersetzt und diese dann mit "001-*.jpg" bis "100-*.jpg" in Kopie getestet. Nachdem "Ergebnis.txt" keinerlei Auffälligkeiten aufwies, habe ich den Code wie folgt geändert:
---
@echo off & setlocal
cd /d %~dp0
set /a Nr=1001
for /f %%i in (Namen.txt) do call :ProcessLine "%%i"
goto :eof
:ProcessLine
for /f "tokens=1* delims=-" %%f in ('dir /b "%Nr:~-3%-*.jpg"') do ren "%%f-%%g" "%~1-%%g"
set /a Nr+=1
---

Nach einem weiteren Testlauf ohne Fehlermeldungen damit, waren die Dateinamen auch tatsächlich wie gewünscht geändert worden.

Sicherheitshalber habe ich dann alle 6.997 Bilddateien in "test" kopiert und "renBAT.cmd" wieder mit 'echo' und '>>Ergebnis.txt' versehen. Da nach einem weiteren Lauf "Ergebnis.txt" wie gewünscht aussah, habe ich den Code wieder in die zuletzt oben komplett dargestellte Form geändert. Damit wurden dann alle Dateien (erstaunlich schnell im Vergleich zu mir bekannten Rename Tools!) wie gewünscht umbenannt.

Über die perfekte und sehr schnelle Hilfe bin ich sehr glücklich!
Vielen Dank nochmal, bastla, Du hast mir sehr geholfen.^^

Grüße
Thilo
bastla
bastla 18.06.2007 um 23:01:54 Uhr
Goto Top
Hallo KoreaFuro!

Ich würde nicht darauf wetten, dass es an den Anführungszeichen lag, da es ja grundsätzlich keinerlei Leerstellen in den (alten und neuen) Dateinamen geben sollte (weswegen ich auch, eigentlich im Gegensatz zu meiner üblichen Vorgangsweise, vorerst darauf verzichtet hatte). Da in den allermeisten Fällen aber keine berechtigten Einwände gegen das Setzen der Anführungszeichen vorliegen, habe ich sie nebenbei zur Sicherheit auch noch eingefügt.

Als wesentlich wahrscheinlicher erachte ich da schon die Begründung, dass das (leider erst nachträgliche) Berücksichtigen des "-" in der Dateisuchmaske zum Erfolg geführt hat: Vermutlich wurden vorher die Dateien mehrfach umbenannt, etwa nach dem Schema "030-05.jpg --> 432cb8-05.jpg --> e6ef7a-05.jpg", was durch das Suchen nach zB "432-*" dann nicht mehr passieren konnte - aber wie auch immer, es freut mich, dass Du nun doch Erfolg hattest.

Im Übrigen danke ich für Deine ausführliche Problembeschreibung und die umfangreichen Rückmeldungen.

Grüße
bastla