chainsaw
Goto Top

Komplexes umbenennen von Dateien

Hallo Gemeinde,

Hab wieder mal ein Problem, vielleicht könnt ihr mich auf die richtige Spur bringen:


Ich hab einige Dateien, die so wie dieses Muster aussehen:

AUS-19052010-AA@BBB-027_CCC_ZV7_DDD.pdf

Ich möchte die Benamung der Dateien so ändern, dass ich _CCC und _DDD entferne, also nur

AUS-19052010-AA@BBB-027_ZV7.pdf

übrig bleibt.

Die Problemstellung: Bis zum @ ist der Dateiname unterschiedlich, aber immer gleich lang - das bekomm ich hin, aber:
BBB kann 2 - 4 Stellen lang sein, für die Bezeichnung _CCC und _DDD gibt es jeweils ca. 20 verschiedene
Kürzel die im Dateinamen vorkommen können.

Mit diesem Code (den hab ich aus einem Beitrag von Biber) kann ich z.B. das _CCC rausschmeissen:

@echo off & setlocal
FOR /R "D:\test" %%i in ("*.pdf") do call :umbenennen "%%~fi"  
goto :EOF

:umbenennen 
Set "name=%~n1"   
Set "Name=%name:_CCC=%"  
If "%name%"=="%~n1" goto :eof  
ren "%~1" "%name%%~x1"  

Wie lösche ich nun aber den Rest aus dem Dateinamen und wie sage ich dem Batch, dass _CCC auch _FFF oder _RRR heissen kann?
Ist sowas überhaupt mit Batch lösbar oder wird das zu kompliziert?

Was meint Ihr?

Gruß chainsaw

Content-ID: 143641

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

Ausgedruckt am: 22.11.2024 um 19:11 Uhr

Snowman25
Snowman25 27.05.2010 um 13:08:50 Uhr
Goto Top
Hallo @chainsaw,

Benutz den TotalCommander. Der hat ein Mehrfach-Umbenenn-Tool das auch RegEx unterstützt. Da tust du dir wesentlich leichter damit. Hat ausserdem eine Vorschau, wie die Dateinamen dann wären.

Grüße
Snow
bankaifan
bankaifan 27.05.2010 um 13:22:41 Uhr
Goto Top
Nur mal rein aus Interesse, Snow, wäre es denn mit Batch möglich?
Snowman25
Snowman25 27.05.2010 um 13:27:03 Uhr
Goto Top
generell schon möglich, aber anders geht es halt wesentlich schneller und einfacher face-wink
Batch ist nicht großartig für Stringmanipulation geeignet, deshalb greife ich bei sowas gerne auf externe Programme zurück.

Mfg
Snow
bankaifan
bankaifan 27.05.2010 um 13:31:29 Uhr
Goto Top
Ok, ...

ich komm mit dem For sowieso ned so ganz zurecht, was hier wohl das wichtigste wäre, mit "denim" und so zeugs =)
Snowman25
Snowman25 27.05.2010 um 13:34:11 Uhr
Goto Top
Zitat von @bankaifan:
"denim"

"delims" :-P
bankaifan
bankaifan 27.05.2010 um 13:51:39 Uhr
Goto Top
genau face-smile

ich check des ned wie der i-wie nen string mti diesem %%i,%%j ... in mehrer teile zerlegt....aber tut jetzt nix zur sache face-smile
77559
77559 27.05.2010 um 14:07:34 Uhr
Goto Top
Hallo chainsaw,

vorausgesetzt die Anzahl und Position der unterstriche in den Dateinamen ist konstant, ist es nicht schwer :

@Echo off&Setlocal
CHCP 1252
Set Base="D:\test"  
Set Out=".\RenPDF.CMD"  
Type NUL >%Out%
FOR /R %Base% %%A in ("*.pdf"  
  ) do for /F "tokens=1-4 delims=_" %%B in ("%%~nA"  
    ) dO Echo Ren "%%~fA" "%%B_%%D.PDF" >>%Out%  
Notepad.exe %Out%
Set /P Answer=Befehle aus der Datei %Out% ausführen ? [J/N]
If /i "%Answer%" EQU "J" %Out%  

Mit dieser Batch werden alle Rename Befehle in eine Datei geschrieben,
die du mit Notepad sichten/bearbeiten kannst bevor du sie ausführst.

Gruß
LotPings
chainsaw
chainsaw 27.05.2010 um 14:45:56 Uhr
Goto Top
Hallo Lotpings,

wenn ich jetzt einen Hut aufhätte, dann würde ich den vor dir ziehen!
Der Hammer! Ich kann zwar nicht nachvollziehen was die Befehle
im einzelnen machen, aber es haut schon fast perfekt hin. Respekt!

Danke dir herzlich und einen schönen Tag!

Gruß
chainsaw
77559
77559 27.05.2010 um 20:28:29 Uhr
Goto Top
Zitat von @chainsaw:
Ich kann zwar nicht nachvollziehen was die Befehle im einzelnen machen, aber es haut schon fast perfekt hin. Respekt!

Naja, ich sehe Biber schon mit der Doku-Keule winken face-wink Also:

Zeile 6 ist dir ja schon bekannt, da hab ich nur das feste Verzeichnis gegen eine Variable getauscht, damit man da nicht mehr "rumschrauben" muss.
Zeile 7 zerlegt den von Z6 übergebenen Namen "%%~nA" (ohne LW,Pfad und Extension)
an dem Trenner Unterstrich "Delims=_" in 4 Teile "tokens=1-4" beginnend bei %%B bis %%E
da du nur den ersten und dritten Teil behalten willst, lasse ich in Zeile 8,
beim zusammenbau des Ren-Befehls eben %%C und %%E weg;
%%A hat ja noch den kompletten alten Namen (erzwungen durch das "~f" in "%%~fA")
und da beim neuen Namen noch die Erweiterung gebraucht wird hänge ich sie einfach dran.
(Hätte ich auch vom alten Namen mit "%%~xA" übernehmen können.)

Über "tokens=1,3" könnte man auch gleich das weglassen steuern,
dann wären es beim Zusammenbau eben %%B und %%C gewesen.

Wenn du dich damit auseinandersetzen willst, kommmst du nicht am intensiven Studium der Hilfe-Ausgabe von "For /?" vorbei.

Gruß
LotPings
Biber
Biber 27.05.2010 um 21:06:20 Uhr
Goto Top
Moin chainsaw,

Zitat von @chainsaw:
Ich kann zwar nicht nachvollziehen was die Befehle im einzelnen machen, aber es haut schon fast perfekt hin.
*seufz*
So möchte diesen Beitrag ungern als "gelöst" in die Geschichte eingehen lassen...
Es ist doch nicht das Ziel dieses Forums, hier irgendwelche Hütchenspielchen abzusiehen.
Und wenn es LotPings' primäres Anliegen wäre, hier nur ein "Huhu - guck mal was ich kann" vorzuführen, dann hätte er bestimmt einen Nickname wie "Zampano" gewählt.

Bitte versuche wenigstens den ganzen undurchschaubaren Zaubertrick anhand der folgenden Testschritte nachzuvollziehen.

Ausgangssituation:
Du hast nach eigenen Aussagen zig Dateien mit der Namenskonvention AUS-19052010-AA@BBB-027_CCC_ZV7_DDD.pdf
Und willst diese bestehende feste Namenskonvention durch eine neue (ebenso feste) neue Konvention ersetzen

Dann lass uns doch das Muster, den Algorithmus suchen....

Wir gehen mal an an CMD-Prompt und legen in einem Spielverzeichnis zwei Spieldateien an:
[Eingabezeilen sind durch ein führendes ">" gekennzeichnet; dieses Zeichen NICHT mit eingeben
Zeilen beginnen mit ">REM" brauchst du auch nicht eingeben, nur lesen face-wink]

>echo x>AUS-19052010-AA@BBB-027_CCC_ZV7_DDD.pdf

>echo x>AUS-19052010-XX@YYY-027_ZZZ_ZV7_BLA.pdf

>REM das Namensmuster ist doch wohl [beliebigeZeichen][Unterstrich][beliebig][_][beliebig][_][beliebig.pdf]
>REM oder auf bätschisch: *_*_*_*.pdf
>REM also finden wir alle umzubenennenden Dateien (aber nicht bereits umbenannte!) mit ...
>dir /b *_*_*_*.pdf
AUS-19052010-AA@BBB-027_CCC_ZV7_DDD.pdf
AUS-19052010-XX@YYY-027_ZZZ_ZV7_BLA.pdf

>REM Wenn wir diese Ausgabenzeilen "unbehandelt" noch durch eine FOR/F-Anweisung schleifen sieht es so aus:
>for /f "delims=" %a in ('dir /b *_*_*_*.pdf') do @echo a[%a]
a[AUS-19052010-AA@BBB-027_CCC_ZV7_DDD.pdf]
a[AUS-19052010-XX@YYY-027_ZZZ_ZV7_BLA.pdf]

>REM Wenn wir dagegen sagen, trenne jede Zeile "token"-weise an jedem "Delimiter" Unterstrich
>for /f "delims=_ tokens=1-4" %a in ('dir /b *_*_*_*.pdf') do @echo Mit Unterstrich als delim a[%a] b[%b] c[%c] d[%d]
Mit Unterstrich als delim a[AUS-19052010-AA@BBB-027] b[CCC] c[ZV7] d[DDD.pdf]
Mit Unterstrich als delim a[AUS-19052010-XX@YYY-027] b[ZZZ] c[ZV7] d[BLA.pdf]

>REM wenn wir jetzt den Token %b weglassen wollen:
>for /f "delims=_ tokens=1-4" %a in ('dir /b *_*_*_*.pdf') do @echo Ren %a_%b_%c_%d %a_%c_%d
Ren AUS-19052010-AA@BBB-027_CCC_ZV7_DDD.pdf AUS-19052010-AA@BBB-027_ZV7_DDD.pdf
Ren AUS-19052010-XX@YYY-027_ZZZ_ZV7_BLA.pdf AUS-19052010-XX@YYY-027_ZV7_BLA.pdf

Mit diesem (ungefährlichen) proof-of-concept am CMD-Prompt kannst du die "Geheimnisse" der FOR/F-Token-Logik verstehen.
Und vielleicht erkennst du, wenn du bis hierhin mitgeturnt hast, den LotPingschen Algorithmus wieder.

Grüße
Biber

[Edit @77559] Danke!
mein Beitrag ist zwar jetzt obsolet, aber ich hatte ihn schon fertig getippt, bevor ich deinen gelesen habe.. [/Edit]
chainsaw
chainsaw 28.05.2010 um 09:48:47 Uhr
Goto Top
Hallo LotPings, hallo Biber

Bitte versuche wenigstens den ganzen undurchschaubaren Zaubertrick anhand der folgenden Testschritte nachzuvollziehen.

Asche auf mein Haupt! Ich geb mir ja Mühe, aber als Nicht-EDV`ler werde ich manche Dinge hier wohl nie hundertprozentig verstehen - und für ne Umschulung zum Batch-Programmierer bin ich zu alt! face-smile
Trotzdem erleichtern mir diverse Batches meinen Arbeitsalltag ganz ungemein - dank der Hilfe hier im Forum.
@Biber: Ich werd dein Tutorial durchackern, versprochen! face-smile

Schönes WE
Gruß chainsaw