Wie ändere ich ein in Dateinamen eingebettetes Zeichen in ein anderes Zeichen?

1441
PilotMom

In einem Verzeichnis mit mehreren Unterverzeichnissen muss ich Dateinamen, die das _Zeichen haben, in ein anderes Zeichen ändern. .Beispiel:

ABC12345_DEF --> ABC12345.DEF 

Ich muss dies rekursiv durch einen Verzeichnisbaum tun.
Die letzten drei Zeichen des Dateinamens stimmen nicht immer überein.

Platzhalter auf beiden Seiten des umbenennen Verwendung _oder .nicht funktioniert (plus Ich brauche dies durch mehrere Verzeichnisse zu tun).

0
Betriebssystem? Daniel Beck vor 13 Jahren 2
möglicherweise doppelte http://superuser.com/questions/205083/command-line-recursive-rename-move-in-windows Patrick vor 13 Jahren 0
Windows XP. Die letzten drei Zeichen stimmen in den Dateien nicht überein PilotMom vor 13 Jahren 0

3 Antworten auf die Frage

1
Kevin Fegan

Diese Batchdatei sollte es für Sie tun.

Kopieren Sie die Batchdatei unten in eine Textdatei und speichern Sie sie als xrename.cmd (oder "was auch immer Sie wollen. Cmd").

Wenn Sie die Datei einfach so ausführen:
xrename.cmd

Es wird im aktuellen Ordner und in allen Unterordnern nachgeschlagen und alle Dateien umbenannt wie: ABC12345_DEF in ABC12345.DEF (alles wie "text_moretext" in "text.moretext").

Sie können auch Werte für "search-string", "replace-string" und "search-pattern" in der Befehlszeile angeben.

Um Anweisungen
anzuzeigen, führen Sie es wie folgt aus : xrename.cmd / help

Hinweis: Ich habe die Stapeldatei so erstellt, dass nur die Dateien angezeigt werden, die umbenannt werden sollen. Es findet jedoch keine Umbenennung statt. Sie können die Batchdatei ausführen und sehen, was passiert, ohne etwas umzubenennen. Nachdem Sie die Datei ausgeführt haben und sicher sind, dass die korrekten Dateien ordnungsgemäß umbenannt werden, können Sie die Zeile wie unten beschrieben löschen, um die Umbenennung zu aktivieren, und dann die Batchdatei erneut ausführen.

Möglicherweise müssen Sie den Wert für "Suchmuster" ändern, um die gewünschten Dateien anzuzeigen.

Bei den Bezeichnungen ": default1" und ": default2" können Sie die Werte für "match-string" "suchmuster" und "replace-string" entsprechend Ihren Anforderungen bearbeiten.

Diese Batch-Datei hat einige Fehlerprüfungen und schlägt nicht fehl, wenn die "Match-Zeichenfolge" in den Namen der Ordner oder Unterordner gefunden wird.

@echo off  if "%~1%~2%~3."=="." goto :default1 if /i "%~1."=="/help." goto :syntax if "%~1."=="." goto :syntax  rem %2 can be empty to use "*matchstring*" as the "search-pattern" rem %3 can be empty to make replacement with empty string (delete matchstring).  set "matchstring=%~1" set "replacestring=%~3"  if "%~2."=="." goto :default2 set "searchpattern=%~2" goto :start  :default1 set "matchstring=_" set "replacestring=."  :default2 set "searchpattern=*%matchstring%*"  :start set "renamecount=0" set "errorcount=0"  echo. for /r %%f in ("%searchpattern%") do call :work "%%~dpf" "%%~nxf" echo. if %renamecount% EQU 0 echo No files renamed. if %renamecount% EQU 1 echo Renamed %renamecount% file. if %renamecount% GEQ 2 echo Renamed %renamecount% files.  if %errorcount% EQU 1 echo %errorcount% error renaming files. if %errorcount% GEQ 2 echo %errorcount% errors renaming files. echo.  goto :cleanexit  :work set matchedfilepath=%~1 set matchedfilename=%~2  rem You can't do it directly like this: rem set "newfilename=%matchedfilename:%matchstring%=%replacestring%%"  for /F "usebackq delims=" %%g in (`echo set "newfilename=%%matchedfilename:%matchstring%=%replacestring%%%"`) do %%g echo In path "%matchedfilepath%": Renaming "%matchedfilename%" to "%newfilename%"     rem delete the next line (goto :EOF) to make renaming active goto :EOF     ren "%matchedfilepath%%matchedfilename%" "%newfilename%" if %errorlevel% NEQ 0 goto :workerror if not exist "%matchedfilepath%%newfilename%" goto :workerror goto :workok  :workerror echo Rename "%matchedfilepath%%matchedfilename%" failed. set /A errorcount=errorcount+1 echo. goto :EOF  :workok set /A renamecount=renamecount+1 goto :EOF  :syntax rem:syntax echo. echo Syntax: echo %~nx0 ["match-string" ["search-pattern"] ["replace-string"]] echo. echo Search for files matching "search-pattern" in current folder and through all  echo subfolders. For each matched file, rename file by replacing "match-string"  echo with "replace-string". echo. echo If "replace-string" is empty or not specified, rename file by deleting  echo "match-string". echo. echo If "search-pattern" is empty, use "*matchstring*" as the "search-pattern". echo. echo If "match-string" "search-pattern" and "replace-string" are all empty or not  echo specified, then defined defaults will be used. echo. echo If "search-pattern" and/or "replace-string" are NOT empty then "match-string"  echo cannot be empty,  echo. goto :EOF  :cleanexit set "matchstring=" set "replacestring=" set "searchpattern=" set "renamecount=" set "errorcount=" set "matchedfilepath=" set "matchedfilename=" set "newfilename=" goto :EOF 

Wenn Sie die Batchdatei ausgeführt haben und sicher sind, dass die korrekten Dateien ordnungsgemäß umbenannt werden, können Sie die Datei bearbeiten, um die beschriebenen Zeilen zu entfernen, um die Umbenennung zu aktivieren, und dann die Batchdatei erneut ausführen.

Um dies zu tun, finde die zwei Zeilen, die so aussehen:

rem delete the next line (goto :EOF) to make renaming active goto :EOF 

Entfernen Sie dann die Zeile "goto: EOF" (oder entfernen Sie beide Zeilen).

Entfernen Sie "goto: EOF" nicht von einer anderen Stelle in der Batchdatei (diese kann an einigen Stellen gefunden werden, stellen Sie also sicher, dass Sie die richtige entfernen).

Wenn dies für Sie nicht funktioniert oder wenn Sie mir etwas in der Batchdatei erklären möchten, lassen Sie es mich wissen.

0
Patrick

Das, was ich bei diesem Batch gefunden habe, umbenennen / verschieben, sollte funktionieren:

for /r %x in (*_*) do ren "%x" *.* 
Es enthält den vollständigen Pfadnamen in Anführungszeichen gefolgt von *. *, aber die Namen in den Verzeichnissen sind unverändert PilotMom vor 13 Jahren 0
0
Asterisk

Folgendes sollte funktionieren. Ich benutzte movestatt renwegen der Besonderheiten renbeim Umgang mit Dateinamen in Anführungszeichen.

for /f "tokens=1,2 delims=_" %i in ( 'dir /s/b *_*.' ) do @( move "%i_%j" "%i.%j" ) 

Sie können die @Option entfernen, wenn Sie den Fortschritt des Befehls visuell verfolgen möchten.

Du bist bemerkenswert !!! DANKE DIR!!!! PilotMom vor 13 Jahren 0
Kann ich dies in einer BAT-Datei zur späteren Verwendung speichern? oder muss ich etwas hinzufügen, damit es funktioniert ... Ich schätze Ihre Hilfe wirklich! PilotMom vor 13 Jahren 0
Damit es in einer Batchdatei funktioniert, müssen Sie alle Variablen, die ein einzelnes Prozentzeichen verwenden, in ein Doppelprozentzeichen ändern. dh ändern Sie alle Instanzen von "% i" in "%% i" und "% j" in "%% j". Asterisk vor 13 Jahren 0
Da dir / s / b den vollständigen Pfad ** und den Dateinamen zurückgibt, schlägt Ren fehl, weil Ren das zweite Argument `% i.% J` nicht mag, das einen Pfad enthält. Umzug mag es gut. Kevin Fegan vor 11 Jahren 0
Da das Trennzeichen gleich "` _` "(` delims = _`) ist und '' dir / s / b '' den vollständigen Pfad und Dateinamen zurückgibt, schlägt diese Lösung fehl, wenn ein Teil des Pfads ein oder mehrere der Elemente enthält. "_" (Unterstrich). Diese Lösung schlägt auch fehl, wenn der Dateiname mehr als "_" enthält, da der vollständige Dateiname nicht durch "% i" und "% j" dargestellt würde. Kevin Fegan vor 11 Jahren 0