рекурсивное переименование имен файлов + имен папок с помощью пакетного файла

StackOverflow https://stackoverflow.com/questions/717171

  •  23-08-2019
  •  | 
  •  

Вопрос

Мне нравится создавать пакетный файл (winxp cmd), который рекурсивно просматривает выбранную папку и подпапки и переименовывает там файлы+папки по следующим правилам:

во всех именах файлов и папок все прописные+строчные буквы «V» и «W» необходимо заменить буквами «Y» и «Z».

например11V0W должно стать 11Y0Z.

Я считаю, что это возможно с помощью FOR /R, но как?Я думаю, что должна быть вызвана подпрограмма, которая проверяет каждую букву одну за другой в дополнение к базовой рекурсии с FOR/R.

Это было полезно?

Решение

Следующий пакет делает это, по крайней мере, для имен файлов.С каталогами немного сложнее (по крайней мере, я пока не смог придумать небесконечного решения):

@echo off
setlocal enableextensions
for /r %%f in (*) do call :process "%%f"
endlocal
goto :eof

:process
pushd "%~dp1"
set fn=%~nx1
set fn=%fn:V=Y%
set fn=%fn:W=Z%
ren "%~nx1" "%fn%"
popd
goto :eof

Но теоретически не должно быть слишком сложно добавить к этому переименование каталога.

Другие советы

Том, возился с предыдущим скриптом, который я опубликовал, вот скрипт, обрабатывающий все файлы и подкаталоги:

recurname.cmd каталог

@echo off
setlocal ENABLEDELAYEDEXPANSION
set Replaces="V=Y" "W=Z" "m=A"
set StartDir=%~dp1
call :RenameDirs "%StartDir:~0,-1%"
exit /b 0
:RenameDirs
    call :RenameFiles "%~1"
    for /f "delims=" %%d in ('dir /ad /b "%~1"2^>nul') do call :RenameDirs "%~1\%%~d"
    if "%~1"=="%StartDir:~0,-1%" exit /b 0
    set _pos=0
    set _dir=%~f1
    set _dir_orig=!_dir!
    :finddirName
        set /a _pos-=1
        call set _dir_pos=!!!_dir:~%_pos%,1!!!
        if not "%_dir_pos%"=="\" goto finddirName
        call set _origines=!!!_dir:~0,%_pos%!!!
        set /a _pos+=1
        call set _dir=!!!_dir:~%_pos%!!!
    for %%r in (%Replaces%) do call set _dir=!!!_dir:%%~r!!!
    if /i not "!_dir!"=="!_dir_orig!" echo move "%~1" "%_origines%\!_dir!"
    exit /b 0
:RenameFiles
    for /f "delims=" %%f in ('dir /a-d /b "%~1"2^>nul') do (
        set _file=%%~nf
        set _file_orig=!_file!
        for %%r in (%Replaces%) do call set _file=!!!_file:%%~r!!!
        if /i not "!_file!"=="!_file_orig!" echo ren "%~1\%%f" "%~1\!_file!%%~xf"
    )
    exit /b 0

___Примечания____
Это неразрушающий скрипт, удалите эхо из правильных команд, чтобы переименовать любой файл/каталог.(эхо двигаться и эхо Рен)

Установить замены =: Установите для этой переменной любые пары, которые вам нужно изменить.

установите Startdir=: Я хотел каким-то образом обезопасить спор и выбрать только путь от него.Если в качестве параметра заданы файлы, будет обработан весь каталог контейнера и подкаталоги.

если "%~1"=="%StartDir:~0,-1%" выход /b 0: Эта строка была помещена, чтобы остановить обработку самого каталога аргументов.Если хотите, удалите эту строку.
Если сценарий вызывается, скажем, с помощью с:\темп\, удаление этой строки приведет к изменению имени на c: eAp\ в конце концов.

с этим деревом каталогов:

.
├── 00v0w
│   ├── 12V0W
│   ├── 12d0w
│   └── 12v0d
├── 11V0W
├── 11d0w
└── 11v0d

эти переименователь команды:

$ renamer --regex --find '[vV]' --replace 'Y' '**'
$ renamer --regex --find '[wW]' --replace 'Z' '**'

выдаст этот результат:

.
├── 00Y0Z
│   ├── 12Y0Z
│   ├── 12Y0d
│   └── 12d0Z
├── 11Y0Z
├── 11Y0d
└── 11d0Z
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top