spidi-25
Goto Top

Dateienamen in Ordnernamen umbenennen

Hallo zusammen

eine frage wie schaffe ich es Dateien im Unterordner in Unterordnernamen umzubenennen?

im Prinzip

V:Test\Variabler Ordner\test.jpg > V:Test\Variabler Ordner\Variabler Ordner.jpg


und bei mehreren Dateien mehr als 1 Datei
V:Test\Variabler Ordner\

Dateien im Variabler Ordner z.B.
test.jpg> Variabler Ordner_a.jpg
testen.jpg> Variabler Ordner_b.jpg
getestet.jpg> Variabler Ordner_c.jpg

test.gif> Variabler Ordner_a.gif
testen.gif> Variabler Ordner_b.gif

Grüße
Spide-25

Content-ID: 151181

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

Ausgedruckt am: 22.11.2024 um 12:11 Uhr

93259
93259 16.09.2010 um 14:51:22 Uhr
Goto Top
Hi,

da fallen mir spontan 2 Möglichkeiten ein.
1. Rechtsklick umbennen
2. Batch schreiben

Was willst du machen?

Gruß Puntonist
BitmeIO101
BitmeIO101 16.09.2010 um 15:03:13 Uhr
Goto Top
Versuch es mal mit Total Commander. Da hast du ein Mehrfach-Umbenenntool bei.
Spidi-25
Spidi-25 16.09.2010 um 15:36:25 Uhr
Goto Top
Hallo Puntonist

Per Batch den sonst hätte ich nicht bei Batch & Shell die Frage gestellt.

Grüße
Spidi-25
Spidi-25
Spidi-25 16.09.2010 um 15:38:30 Uhr
Goto Top
Das kenne ich auch schon aber dieser Ablauf kommt fast täglich und soll nach einem anderen Batch ablaufen!
93259
93259 16.09.2010 um 15:46:32 Uhr
Goto Top
http://forum.fachinformatiker.de/windows-betriebssysteme/75037-ms-dos-b ...

vielleicht hilft dir das. da kannst du dir die Batch so zusammenbasteln wie du es gern hättest.
bastla
bastla 16.09.2010 um 21:23:55 Uhr
Goto Top
Hallo Spidi-25!

Nicht ganz Deinen Vorgaben entsprechend, aber vielleicht doch passend:
@echo off & setlocal
for /d %%i in ("V:\Test\*.*") do (  
    pushd "%%i"  
    for /f "delims=" %%a in ('dir /b /a-d') do call :ProcessFile "%%~nxi" "%%a"  
    popd
)
goto :eof

:ProcessFile
if not exist "%~1%~x2" ren %2 "%~1%~x2" & goto :eof  

set /a Zusatz=1
:Loop
set /a Zusatz+=1
if exist "%~1_%Zusatz%%~x2" goto :Loop  

ren %2 "%~1_%Zusatz%%~x2"  
goto :eof
Es wird jeder Unterordner von "V:\Test" durchlaufen und für die Dauer der Verarbeitung mit "pushd" zum aktuellen Verzeichnis gemacht (erleichtert das Vergleichen und Umbenennen, da keine Pfade berücksichtigt werden müssen).

Für jede Datei wird im Unterprogramm ":ProcessFile" (beim Aufruf wird der Ordnername = neue Dateiname als erster und der alte Dateiname als zweiter Parameter übergeben) zunächst geprüft, ob sie unmittelbar umbenannt werden kann (da eine Datei "Ordnername.Dateityp" noch nicht vorhanden ist) und dies im Fall des Falles auch durchgeführt.

Ist bereits eine nach dem Ordner benannte Datei des aktuellen Typs vorhanden, muss ein Namenszusatz verwendet werden, wobei sich eine laufende Nummer einfacher hinzufügen lässt als einzelne Buchstaben. Die Nummer wird solange hochgezählt, bis es keine mit dieser Nummer als Zusatz benannte Datei mehr gibt; dann kann umbenannt werden.

Grüße
bastla

[Edit] Überflüssiges "n" in "%~n1" in den Zeilen 15 und 17 entfernt [/Edit]
Florian.Sauber
Florian.Sauber 16.09.2010 um 22:18:43 Uhr
Goto Top
Zitat von @Spidi-25:
V:Test\Variabler Ordner\test.jpg > V:Test\Variabler Ordner\Variabler Ordner.jpg

und bei mehreren Dateien mehr als 1 Datei
V:Test\Variabler Ordner\

Dateien im Variabler Ordner z.B.
test.jpg> Variabler Ordner_a.jpg
testen.jpg> Variabler Ordner_b.jpg
getestet.jpg> Variabler Ordner_c.jpg

test.gif> Variabler Ordner_a.gif
testen.gif> Variabler Ordner_b.gif

Kommt es auf eine "feste Zuordnung" an? Sprich soll "test" durch "a" und getestet durchgehend durch "c" repräsentiert werden?
Florian.Sauber
Florian.Sauber 16.09.2010 um 23:14:25 Uhr
Goto Top
Na ja ich denk mal das geht auch so...
Mit Batch-Scripting wird das schon ganz schön kompliziert. Machbar klar, aber um einiges schneller gehts mit einem File-Renamer.
Das äußerst feine (Windows!) Tool Bulk Rename Utility kennt die "Option Append Folder Name", da kannst Du entscheiden, ob der Verzeichnisname als Prä- oder Suffix konkanetiert werden soll und Du kannst entscheiden, welches ASCII-Zeichen als Seperator fungieren soll und wie viele vorherige Verzeichnisse mit einbezogen werden.

Klar denkt man jetzt, bestimmt ganz nett, aber jedesmal so ne blöde GUI aufrufen und alles umständlich von Hand setzten...

Da ist es besonders schön, daß es das Tool auch für die Kommandozeile gibt. Heißt dann Bulk Rename Command und kann mit den meisten Funktionen der GUI-Version mithalten.

Wenn Du also in V:Test\Variabler Ordner\ Dateien liegen hast, wird folgendes zu gewünschten Ergebnis führen:
brc32 /DIR:V:Test\Variabler Ordner /FIXEDNAME: /APPENDFOLDER:P::1 /AUTONUMBER:1:1:S:_:38:1 /SORTBY:C
in dem Fall würde sich noch gar nichts ändern, aber Dir wird auf der Kommandozeile angezeigt, wie es sich verändern WÜRDE.
Mit dem zusätzlichen Parameter /EXECUTE wirds dann fertiggeschrieben!

Kurz zur Erklärung(aus der beiliegenden Dokumentation):
/SORTBY:Mode - Specify the sort-sequence. Mode is as follows:
N -Filename (the default)
C -Changed date
M - Modified date
A -Accessed date
S - Size (n/a for folders)
R -Random
(ich hab oben M genommen, da ich davon ausging, dass "getestet" nach "testen" nach "test" erstellt wurde und Dir die zuordnung wichtig ist.)

/APPENDFOLDER:Mode:Separator:Levels - Append the parent folder name(s) to the name. The
parameters are as follows:
Mode - P refix, S uffix, or B oth
Separator - the text to place between the name and the folder text. Can be blank.
Levels - How many levels of folders to append (e.g. 1 would be the parent, 2 would be the
parent and its parent).

/AUTONUMBER:Start:Increment:Mode:Separator:Base:Pad - this allows you to append an incrementing number to the >filename. The parameters are as follows:
Start - the number at which to begin
Increment - how many to increment by each time
Mode - P refix, S uffix, or B oth
Separator - the text to place between the name and the autonumber text. Can be blank.
Base - The base number to use. Normally 10, but can be 2 (binary) to 36. There are also two
special bases, 37 and 38, which will cause only letters A-Z to be used.
Pad - you can choose to pad the autonumber. e.g. a pad value of 3 would result in 001, 002,
003, 004 etc.
Darüberhinaus kennt BRC noch jede Menge weitere Parameter, die in der beiliegenden Dokumentation beschrieben sind.
Da wären z.B.
/RECURSIVEUm rekursiv Unterverzeichnisse einzubeziehen
/PATTERNz.B. *.tiff
/IGNOREFILEXwenn man auch die Dateierweiterung verändern will)
/INCLHFür versteckte DAteien und Ordner
/INCLSFür Systemdateien
/CHANGECASE
/REGEXPzur Verwendung regulärer Ausdrücke
/NODUPum gleichlautende Namen zu verhindern
/APPENDDATE Datum und Zeit

und das geht gerade so weiter. Für mich eins der besten Rename-Tools unter Windows. Und über Staüelverarbeitung wunderbar steuerbar


Ach eins noch, in meiner Version stand damals in der Dokumentation, es gäbe den Parameter /SORTDIR oder so ähnlich.
Der führte aber immer zu Fehlern. während /SORTBY wunderbar funktioniert, aber nicht in der Dokumentation vorkommt.

Und an die anderen Leser: Ist das Tool bekannt? Sonst mach ich mal ne Anleitung/Tipp daraus...

LG Florian
Spidi-25
Spidi-25 17.09.2010 um 12:56:31 Uhr
Goto Top
@bastla

funktioniert so weit gut komm auch mit der Nummerierung klar, nur

wenn sich nur eine *.jpg Datei im Ordner befindet, dann so umbenennen:
V:Test\Variabler Ordner\test.jpg > V:Test\Variabler Ordner\Variabler Ordner.jpg


und bei mehreren Dateien, mehr als 1 Datei
V:Test\Variabler Ordner\
Variabler Ordner_1.jpg
Variabler Ordner_2.jpg

@Florian.Sauber
Deinen Beitrag werde ich übers Wochenende verdauen.

Grüße
Spidi-25
Florian.Sauber
Florian.Sauber 17.09.2010 um 14:36:20 Uhr
Goto Top
Zitat von @Spidi-25:
wenn sich nur eine *.jpg Datei im Ordner befindet, dann so umbenennen:
V:Test\Variabler Ordner\test.jpg > V:Test\Variabler Ordner\Variabler Ordner.jpg

und bei mehreren Dateien, mehr als 1 Datei
V:Test\Variabler Ordner\
Variabler Ordner_1.jpg
Variabler Ordner_2.jpg

Und warum das? Konsistent is das ja nicht gearde, oder ist das einzelne Bild grundlegend anders als ein nummeriertes Bild? Ich meine, wenn Du dann wenigstens folgendes wölltest.
V:Test\Variabler Ordner\
Variabler Ordner.jpg
Variabler Ordner_1.jpg
...

Für den Fall, dass da eine Logik dahintersteckt, wäre es auch angebracht, sie den Leuten mitzuteilen. Am besten anhand eines spezifischen Szenarios.
bastla
bastla 17.09.2010 um 15:19:17 Uhr
Goto Top
Hallo Spidi-25!

Die gewünschte Unterscheidung ist möglich, aber vergleichsweise aufwändig - insofern würde mich auch der Sinn dahinter interessieren ...

Grüße
bastla
bastla
bastla 17.09.2010 um 15:21:04 Uhr
Goto Top
@Florian.Sauber
Konsistent finde ich Deinen Vorschlag auch nicht unbedingt - das wäre ja dann eher
V:Test\Variabler Ordner\
Variabler Ordner_0.jpg
Variabler Ordner_1.jpg
...
face-wink

Grüße
bastla
Florian.Sauber
Florian.Sauber 17.09.2010 um 16:52:09 Uhr
Goto Top
@bastla

Klar,da hast Du innerhalb des Verzeichnisses mit n Dateien schon recht.
Ich meinte mit Konsistenz aber doch die Widerspruchsfreiheit über die einzelnen Verzeichnisse hinweg. Ob das zusätzlich inkrementelle Unterscheidungsmerkmal dann bei 0, 1, a/A oder sonstwas anfängt, ist dann ja zweitranging. Vorausgesetzt eben, er will Verzeichnisse, die Dateien ohne Alphanumerische Suffixe enthalten.
Ich würde im -Gegensatz zu seinem Bsp.- auch die alleinstehende Datei "VariablerOrdner_0.jpg" (oder "VariablerOrdner_X.jpg") nennen. Und da treffen wir uns ja dann bestimmt wieder.face-wink

Spätestens aber bei
Zitat von @bastla:
Die gewünschte Unterscheidung ist möglich, aber vergleichsweise aufwändig - insofern würde mich auch der Sinn
dahinter interessieren ...

Grüße Flo
Echt schön hier im Forum face-smile
bastla
bastla 17.09.2010 um 17:01:21 Uhr
Goto Top
@Florian.Sauber
War ja gar nicht (sooo) ernst gemeint ... face-wink

Echt schön hier im Forum face-smile
Na dann (leicht verspätet) noch ein "Willkommen" ... face-smile

Grüße
bastla
Florian.Sauber
Florian.Sauber 17.09.2010 um 17:33:55 Uhr
Goto Top
Zitat von @bastla:
@Florian.Sauber
War ja gar nicht (sooo) ernst gemeint ... face-wink

Keine Angst, hatte ich auch so verstanden. Wollte es nur für Spidi "etwas" nachvollziehbarer machen.

Na dann (leicht verspätet) noch ein "Willkommen" ... face-smile

Danke, freu mich schon auf mehrface-smile

Grüße Flo
Spidi-25
Spidi-25 17.09.2010 um 17:43:59 Uhr
Goto Top
@bastla

es gibt eigentlich keinen besonderen Grund, das Beispiel von dir

V:Test\Variabler Ordner\
Variabler Ordner_0.jpg
Variabler Ordner_1.jpg

wäre schon recht, wen das erste Bild mit _1 anfangen würde

momentan sieh es wie das Beispiel von Florian.Sauber

V:Test\Variabler Ordner\
Variabler Ordner.jpg
Variabler Ordner_1.jpg

Grüße
Spide-25
Florian.Sauber
Florian.Sauber 17.09.2010 um 17:53:17 Uhr
Goto Top
Wie jetzt, was jetzt, wo jetzt?
Wenns momentan so aussieht, dann ist es doch das, was Du wolltest?!
Ich hoffe, Du weißt, was Du willst, ich weiß es nämlich nicht mehr...
Spidi-25
Spidi-25 17.09.2010 um 18:05:52 Uhr
Goto Top
eben nicht vielleicht habe ich mich falsch ausgedrückt, am Anfang wollte ich wollte ich a,b,c
Zitat von @Spidi-25:

Dateien im Variabler Ordner z.B.
test.jpg> Variabler Ordner_a.jpg
testen.jpg> Variabler Ordner_b.jpg
getestet.jpg> Variabler Ordner_c.jpg

test.gif> Variabler Ordner_a.gif
testen.gif> Variabler Ordner_b.gif

danach habe ich gemeint, funktioniert so weit gut komm auch mit der Nummerierung klar

und bei mehreren Dateien, mehr als 1 Datei
V:Test\Variabler Ordner\
Variabler Ordner_1.jpg
Variabler Ordner_2.jpg

es war noch nie die rede von

V:Test\Variabler Ordner\
Variabler Ordner.jpg
Variabler Ordner_1.jpg

Grüße
Spidi-25
bastla
bastla 17.09.2010 um 19:54:00 Uhr
Goto Top
Hallo Spidi-25!

Falls Du generell einen Zusatz "_#" verwenden willst (wodurch dann eben auch einzelne Dateien auf "Variabler Ordner_1.jpg" umbenannt würden), dann einfach:
@echo off & setlocal
for /d %%i in ("V:\Test\*.*") do (  
    pushd "%%i"  
    for /f "delims=" %%a in ('dir /b /a-d') do call :ProcessFile "%%~nxi" "%%a"  
    popd
)
goto :eof

:ProcessFile
set /a Zusatz=0
:Loop
set /a Zusatz+=1
if exist "%~1_%Zusatz%%~x2" goto :Loop  

ren %2 "%~1_%Zusatz%%~x2"  
goto :eof
Bei einer größeren Anzahl von Dateien würde ich noch etwas formatieren - 2-stellig zB (als Ersatz der Zeilen 9ff):
:ProcessFile
set /a Zusatz=10000
:Loop
set /a Zusatz+=1
if exist "%~1_%Zusatz:~-2%%~x2" goto :Loop  

ren %2 "%~1_%Zusatz:~-2%%~x2"  
goto :eof
Grüße
bastla
Florian.Sauber
Florian.Sauber 17.09.2010 um 20:02:22 Uhr
Goto Top
Zitat von @Spidi-25:
eben nicht vielleicht habe ich mich falsch ausgedrückt....

Nee, war mein Fehler!

Grüße Flo
Spidi-25
Spidi-25 18.09.2010 um 20:43:42 Uhr
Goto Top
Vielen dank bastla und Florian.Sauber für die hilfe

jetzt im Nachhinein ist es auch logisch die Zeile 10 zu entfernen, es wird nicht mehr nach dem Dateinamen=Ordnernamen gesucht sondern gleich die 1 Datei in +_1 umbenannt.


habe den code noch etwas abgeändert

@echo on & setlocal 
for /d %%i in (.) do ( 
    pushd "%%i"  
    for /f "delims=" %%a in ('dir /b /a-d *.jpg') do call :ProcessFile "%%~nxi" "%%a"   
    popd 
) 

um direkt im Ordner nur jpg´s in Ordnernamen und nicht im Unterordner Dateien in Unterordnernamen umzubenennen, ist mein Ansatz richtig (ist nur für Übungszweke)?

eine weitere frage nur Interesse halber
gibt es bei if exist nicht die Möglichkeit wen Deiteierweiterung größer als 1 dann goto nach?

habe noch eine Aufgabe bezüglich wöchentlicher Datensicherung, werde es versuchen selbst zu lösen. Unabhängig davon ob ich es selbst hin bekomme oder nicht ich werde später einen Beitrag dazu eröffnen, und auf Einzelheiten eingehen.

Grüße
Spidi-25
bastla
bastla 18.09.2010 um 23:02:20 Uhr
Goto Top
Hallo Spidi-25!

Ob Dein Ansatz richtig (oder zumindest funktionsfähig face-wink) ist, sollten eigentlich Deine Tests schon gezeigt haben - die Zeilen 3 und 5 sind allerdings entbehrlich (und eine ganz gewöhnliche "for"-Schleife täte es auch) ...
gibt es bei if exist nicht die Möglichkeit wen Deiteierweiterung größer als 1 dann goto nach?
Mir ist die Frage nicht wirklich klar, aber Du kannst ja jeden Dateinamen zerlegen und dann die Teile mit "if" untersuchen - und wenn tatsächlich die Erweiterung gemeint wäre, erhältst Du diese (allerdings mit einem Punkt vorweg) mit
for %%i in (Datei.Typ) do set "Erw=%%~xi"
Falls Du Erweiterungen der Art "001", "002", etc (also jeweils 3 Ziffern) verarbeiten willst, kannst Du auf > 1 etwa so prüfen:
for %%i in (Datei.009) do set "Erw=%%~xi"  
set "IstZahl=true"  
for /f "delims=.0123456789" %%a in ("%Erw%") do set "IstZahl="  
if not defined IstZahl goto :KeineZahl
set /a Wert=1%Erw:~1%-1000
if %Wert% gtr 1 goto :Label
Es wird zunächst untersucht, ob die Erweiterung nur aus Ziffern besteht und nur in diesem Fall der Vergleich mit dem Wert 1 vorgenommen.

Warum das "Kunststück" mit dem Tausender? Wenn eine Zahl mit 0 beginnt, wird diese in Batch als Oktalzahl interpretiert - was solange nix ausmacht, solange keine 8 und 9 (es gibt ja nur die Ziffern 0 bis 7 im Oktalsystem) vorkommen. Das Voranstellen der "1" sorgt dafür, dass die Zahl nicht mit 0 beginnt, was allerdings bei dreistelligen Zahlen bewirkt, dass die 1 den Wert 1000 repräsentiert - deshalb muss dann wieder 1000 subtrahiert werden.

Grüße
bastla

[Edit] Entfernen des Punktes am Beginn der Erweiterung ergänzt [/Edit]
Suzi10
Suzi10 03.11.2010 um 23:36:20 Uhr
Goto Top
Liebe Programmierer!
Auf der Suche nach der Möglichkeit Dateinamen in die jeweiligen Ordnernamen einer größeren Ordnerstruktur per Batch umzubenennen, bin ich auf Eure interessanten Beiträge gestoßen, und ich möchte mich für deren Veröffentlichung bedanken, denn dies hat mir sehr weitergeholfen und enorm Zeit gespart.
Nun habe ich mich extra angemeldet, weil ich so sehr hoffe, dass Ihr mir mit noch einem Sonderwunsch helfen könnt.
Ich möchte nämlich am liebsten die Dateinamen beibehalten und den Ordnernamen entweder voransetzen oder dranhängen:
Die Dateien Bild.bmp und Ton.wav sind im Ordner X:\Beispiel\Muster und würden nachher zB.MusterBild.bmp und MusterTon.wav heißen.
Ich würde mich riesig freuen, wenn mir da bitte jemand weiterhelfen kann, denn ich habe privat tausende Daten in hunderten Ordnern, die ich zu verarbeiten habe.
Beste Grüße
Suzi
Biber
Biber 04.11.2010 um 08:09:14 Uhr
Goto Top
Moin Suzi10,

willkommen im Forum.
Es würde mich freuen, wenn du aus deiner Triitbrettfrage einen eigenen Beitrag machst - dieser hier ist eigentlich schon abgehakt.

Als Schnellschuss zu deiner Frage eine ungetestete Antwort.

Es lässt sich (wenn es denn eine einmalige Aktion ist) eigentlich schnell vom CMD-Prompt aus abkaspern.

Beispiel: Wenn ich in meinem Unterverzeichnis "Y:\Eigene Dateien\Download" alle Dateien der Konvention "p*.zip" umbenamsen wollte in "Download_p*.zip", dann würde diese Zeile der Anforderung genügen.
>for /d %o in ("Y:\Eigene Dateien\Download") do @for %i in ("%~o\p*.zip") do @echo Ren "%i" "%~nxo_%~nxi"
Ren "Y:\Eigene Dateien\Download\persbackup4.zip" "Download_persbackup4.zip"
Ren "Y:\Eigene Dateien\Download\plsqleditor_0.4.9.zip" "Download_plsqleditor_0.4.9.zip"
wobei ein "@echo ren.." statt eines "Ren ..." dem gefahrlosen Testen dient.

Anmerkung: Ich empfehle dringendst, diese Umbenamserei auch wirklich vom CMD-Prompt nach obigem Muster (einmal mit "echo ren", danach ggf. mit "ren" ) einmalig durchzuführen.
Denn: wenn es unbeaufsichtigt im Batch läuft, dann heißt die Datei
  • nach dem 1 Lauf "Download_persbackup4.zip"
  • nach dem 2 Lauf "Download_Download_persbackup4.zip"
  • nach dem 3 Lauf "Download_Download_Download_persbackup4.zip"
etc.
Jedenfalls wenn keine entsprechende Prüfung erfolgt.

Grüße
Biber
Suzi10
Suzi10 04.11.2010 um 09:53:09 Uhr
Goto Top
Oh pardon, Biber, das Häkchen hatte ich gar nicht bemerkt...
Aber Danke für Deine schnelle Antwortface-smile

Wenn ich also unter X:\Beispiel\ etliche Unterordner (Muster1, Muster2, Muster3, ... mit Dateien habe, sähe bastla's in meinem Fall so aus, um sämtliche Namen an deren Ordner anzupassen:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
@echo off & setlocal
for /d %%i in ("X:\Beispiel\\*.*") do (
pushd "%%i"
for /f "delims=" %%a in ('dir /b /a-d') do call :ProcessFile "%%~nxi" "%%a"
popd
)
goto :eof

:ProcessFile
if not exist "%~1%~x2" ren %2 "%~1%~x2" & goto :eof

set /a Zusatz=1
:Loop
set /a Zusatz+=1
if exist "%~1_%Zusatz%%~x2" goto :Loop

ren %2 "%~1_%Zusatz%%~x2"
goto :eof
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Um jetzt also die bestehenden Dateinamen mit den jew.Ordnernamen zu ergänzen, könnte ich Dein Skript hernehmen? Aber das sieht für mich so aus, dass dann alle Dateinamen und auch deren Endung (ungefähr) gleich sein müssten?
In meinem Fall haben die Dateien aber alle unterschiedliche Namen und Endungen.
Wie müsste ich in diesem Fall vorgehen?

Liebe Grüße zurück!