В директории с несколькими подкаталогами, мне нужно изменить имена файлов , которые имеют _ символ к другому . , например:

ABC12345_DEF --> ABC12345.DEF

Мне нужно сделать это рекурсивно через дерево каталогов.
Последние три символа имени файла не всегда совпадают.

Использование подстановочных знаков переименования по обе стороны от _ или . не работает (плюс мне нужно сделать это через несколько каталогов).

3 ответа3

1

Этот пакетный файл должен сделать это за вас.

Скопируйте приведенный ниже пакетный файл в текстовый файл и сохраните его как xrename.cmd (или «что хотите. Cmd»).

Если вы просто запустите файл так:
xrename.cmd

Он будет выглядеть в текущей папке и во всех подпапках и переименовать все файлы, например: ABC12345_DEF в ABC12345.DEF (что-нибудь от "text_moretext" до «text.moretext»).

Вы также можете указать значения для «search-string», «replace-string» и «search-pattern» в командной строке.

Чтобы показать инструкции, запустите его так:
xrename.cmd /help

Примечание: я сделал командный файл только для отображения файлов, которые будут переименованы, переименование фактически не произойдет. Вы можете запустить командный файл и посмотреть, что произойдет, фактически ничего не переименовывая. После того, как вы запустите его и убедитесь, что правильные файлы будут правильно переименованы, вы можете удалить строку, как описано ниже, чтобы сделать переименование активным, а затем снова запустить пакетный файл.

Возможно, вам придется изменить значение «search-pattern» для отображения нужных вам файлов.

На ярлыках «:default1» и «:default2» вы можете редактировать значения «match-string», «search-pattern» и «replace-string» в соответствии со своими потребностями.

Этот пакетный файл имеет некоторую проверку ошибок, и он не будет работать, если в именах каких-либо папок или подпапок будет найдена «строка соответствия».

@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

После того, как вы запустили пакетный файл и уверены, что правильные файлы будут правильно переименованы, вы можете отредактировать файл, чтобы удалить описанные строки, чтобы сделать переименование активным, а затем снова запустить пакетный файл.

Для этого найдите две строки, которые выглядят так:

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

Затем удалите строку с надписью «goto:EOF» (или удалите обе строки).

Не удаляйте «goto:EOF» из любого другого места в командном файле (его можно найти в нескольких местах, поэтому обязательно удалите правильный).

Если это не работает для вас, или если вы хотите, чтобы я что-то объяснил в командном файле, просто дайте мне знать.

0

модифицируя то, что я нашел в этом пакетном сценарии переименования / перемещения, это должно работать:

for /r %x in (*_*) do ren "%x" *.*
0

Следующее должно работать. Я использовал move вместо ren из-за особенностей ren при обработке имен файлов в кавычках.

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

Вы можете удалить @ если хотите визуально отслеживать ход выполнения команды.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .