Dateinamen umbenennen Namensteil suchen und ersetzen, bzw. ab Fundort den Rest löschen
Hallo zusammen,
Ich habe ein paar tausend Dateien in mehreren Unterverzeichnissen, die fast immer zu viele Zeichen im Dateinamen enthalten.
Beispiel:
"Anfang mit Leerzeichen dann SD Schlussteil und noch 12345678 1234.txt"
Die länge der Dateinamen ist nie gleich, aber der Suchstring, ab der der Dateiname gekürzt werden soll ist " SD "".
Beispiel einer korrekt umbenannten Datei wäre dann:
"Anfang mit Leerzeichen dann.txt"
Ich habe schon sehr viele Ansätze hier gefunden, aber zum Ziel hat es noch nicht geführt.
Fast hätte ich mit diesem Code mein Ziel erreicht:
for %%f in (* SD *.*) do @for /f "delims=SD" %%n in ('echo %%~f') do @echo ren "%%~f" "%%n%%~xf"
Aber hier wird nur EIN Zeichen zum Vergleich herangezogen. Nutzt mir also nichts.
Und wenn es dann auch noch für Unterverzeichnisse anwendbar wäre, hätte ich nochmals viel arbeit gespart. Muss aber nicht zwingend sein.
Wenn mir da jemand den rechten Tipp geben könnte, wäre das toll
Danke
Ich habe ein paar tausend Dateien in mehreren Unterverzeichnissen, die fast immer zu viele Zeichen im Dateinamen enthalten.
Beispiel:
"Anfang mit Leerzeichen dann SD Schlussteil und noch 12345678 1234.txt"
Die länge der Dateinamen ist nie gleich, aber der Suchstring, ab der der Dateiname gekürzt werden soll ist " SD "".
Beispiel einer korrekt umbenannten Datei wäre dann:
"Anfang mit Leerzeichen dann.txt"
Ich habe schon sehr viele Ansätze hier gefunden, aber zum Ziel hat es noch nicht geführt.
Fast hätte ich mit diesem Code mein Ziel erreicht:
for %%f in (* SD *.*) do @for /f "delims=SD" %%n in ('echo %%~f') do @echo ren "%%~f" "%%n%%~xf"
Aber hier wird nur EIN Zeichen zum Vergleich herangezogen. Nutzt mir also nichts.
Und wenn es dann auch noch für Unterverzeichnisse anwendbar wäre, hätte ich nochmals viel arbeit gespart. Muss aber nicht zwingend sein.
Wenn mir da jemand den rechten Tipp geben könnte, wäre das toll
Danke
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 338085
Url: https://administrator.de/forum/dateinamen-umbenennen-namensteil-suchen-und-ersetzen-bzw-ab-fundort-den-rest-loeschen-338085.html
Ausgedruckt am: 05.05.2025 um 05:05 Uhr
9 Kommentare
Neuester Kommentar
Moin,
an deiner Stelle würde ich das in der Powershell mit regex lösen. Mal als Beispiel für ein regex:
Dann musst du nur noch wissen, wie eine Liste mit deinen Dateien bekommst: gci -Recurse http://www.computerperformance.co.uk/powershell/powershell_recurse.htm
und wie man Dateien umbenennt: https://www.windowspro.de/script/rename-item-dateien-umbenennen-powershe ...
und was eine Pipeline ist: https://msdn.microsoft.com/de-de/powershell/scripting/getting-started/fu ...
und noch eine Kleinigkeit über Schleifen wie Foreach: https://www.windowspro.de/script/schleifen-powershell-foreach-while-do-u ...
Gruß
an deiner Stelle würde ich das in der Powershell mit regex lösen. Mal als Beispiel für ein regex:
'Anfang mit Leerzeichen dann SD Schlussteil und noch 12345678 1234.txt' -cmatch "^([a-zA-Z0-9 ]*) SD [a-zA-Z0-9 ]*(.txt)$"
$matches[1]+$matches[2]
Dann musst du nur noch wissen, wie eine Liste mit deinen Dateien bekommst: gci -Recurse http://www.computerperformance.co.uk/powershell/powershell_recurse.htm
und wie man Dateien umbenennt: https://www.windowspro.de/script/rename-item-dateien-umbenennen-powershe ...
und was eine Pipeline ist: https://msdn.microsoft.com/de-de/powershell/scripting/getting-started/fu ...
und noch eine Kleinigkeit über Schleifen wie Foreach: https://www.windowspro.de/script/schleifen-powershell-foreach-while-do-u ...
Gruß

PS
Batch
Gruß
gci 'd:\Ordner\*.txt' -Recurse | ?{$_.Basename -cmatch ' SD '} | rename-item -Newname {"$($_.Basename.split(' SD ',2))$($_.Extension)"}
@echo off &setlocal Enabledelayedexpansion
for /f "delims=" %%a in ('dir /b /s /a-d "d:\ordner\*.txt" ^| find " SD "') do (
set "name=%%~na"
for /f "tokens=1 delims=#" %%b in ("!name: SD =#!") do ren "%%a" "%%b%%~xa"
)

Ach so dann habe ich das missinterpretiert, s. Anpassung oben ...

Das kannst du ja anpassen mit dem Schalter /i.
Bzw. kann das jedes Rename-Programm was mit Regex umgehen kann.
Vorgabe ist (fast) der gleiche Dateiname: "Anfang mit Leerzeichen dann SD Schlussteil und noch 12345678 1234 und noch mehr Text.txt"
Hier ist das - wohl noch kompliziertere - Problem, dass die Ziffern "12345678 1234" gelöscht werden sollen. Die Anzahl der Ziffern ist immer gleich, 8 + Leerzeichen + 4. Die Ziffern sind natürlich bei jeder Datei unterschiedlich.
Lässt sich das mit einer Batch lösen?
Du solltest dich mal mit Regular Expressions beschäftigen, damit sind solche Sachen ein Klacks!Hier ist das - wohl noch kompliziertere - Problem, dass die Ziffern "12345678 1234" gelöscht werden sollen. Die Anzahl der Ziffern ist immer gleich, 8 + Leerzeichen + 4. Die Ziffern sind natürlich bei jeder Datei unterschiedlich.
Lässt sich das mit einer Batch lösen?
@echo off
powershell -Executionpolicy ByPass -Command "gci 'c:\Ordner\*.txt' -Recurse | ?{$_.Basename -match '\d{8} \d{4}'} | rename-item -NewName {$_.Name -replace '\d{8} \d{4}',''}" -Force
Ich habe das Opening dieses Threads mit meinem ersten Post heute Vormittag einem Praktikanten in die Hand gedrückt. Sein Vorwissen: Er kennt Excel-Formeln recht gut und hat hin und wieder mal ein aufgezeichnetes VBA-Makro geändert.
Nach etwas über 1 Stunde und ohne vorher was über die Powershell gewusst zu haben, hatte er das Skript bis auf einen kleinen Fehler fertig.
Im Unterschied zu dir hat er nun aber was gelernt.
Gruß