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:
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 143641
Url: https://administrator.de/contentid/143641
Ausgedruckt am: 22.11.2024 um 19:11 Uhr
11 Kommentare
Neuester Kommentar
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
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
"delims" :-P
Hallo chainsaw,
vorausgesetzt die Anzahl und Position der unterstriche in den Dateinamen ist konstant, ist es nicht schwer :
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
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
Zitat von @chainsaw:
Ich kann zwar nicht nachvollziehen was die Befehle im einzelnen machen, aber es haut schon fast perfekt hin. Respekt!
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 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
Moin chainsaw,
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 ]
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]
Zitat von @chainsaw:
Ich kann zwar nicht nachvollziehen was die Befehle im einzelnen machen, aber es haut schon fast perfekt hin.
*seufz*Ich kann zwar nicht nachvollziehen was die Befehle im einzelnen machen, aber es haut schon fast perfekt hin.
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 ]
>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
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]