рекурсивное переименование имен файлов + имена папок с командным файлом - PullRequest
2 голосов
/ 04 апреля 2009

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

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

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

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

Ответы [ 3 ]

6 голосов
/ 26 августа 2009

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

recurename.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

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

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

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

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

6 голосов
/ 04 апреля 2009

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

@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

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

0 голосов
/ 04 октября 2013

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

.
├── 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...