nomes de arquivos renomeação recursiva + nomes de pastas com um arquivo de lote
-
23-08-2019 - |
Pergunta
Eu gosto de criar um arquivo de lote (winxp cmd) que recursivamente passa por um escolheu pasta pastas e sub e renomeia há arquivos + pastas com as seguintes regras:
de todos os arquivos + pasta nomes, todas as letras maiúsculas + minúscula "V" e "W" cartas precisam ser substituídos com as letras "Y" e "Z".
por exemplo. 11V0W deve tornar-se 11Y0Z.
Eu acredito que é possível com a FOR / R mas como? Eu acho que precisa ser uma sub-rotina a ser chamado, que verifica cada carta, um por um, além de recursão básica com FOR / R.
Solução
O lote seguinte faz isso para os nomes de arquivos, pelo menos. Diretórios são um pouco mais complicado (pelo menos eu não poderia vir acima com uma solução não-infinito até agora):
@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
Mas, em teoria, não deve ser muito difícil de renomeação tack dir sobre isso.
Outras dicas
Tom, brincar com um script anterior eu postei, aqui está um processamento de todos os arquivos e subdiretórios:
recurename.cmd diretório
@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
___ Notas ____
Este é um script não-destrutivo, remover o echo a partir dos comandos corretos, a fim de mudar o nome de qualquer arquivo / diretório. ( echo movimento e echo ren )
Definir Substitui =: Definir esta variável para qualquer pares que você precisa mudou.
set startdir =: Eu queria garantir, de alguma forma, o argumento e tendo apenas o caminho dele. Se um arquivos é dado como um parâmetro, todo o diretório recipiente e subdiretórios serão processados.
se "% ~ 1" == "% startdir: ~ 0, -1%" exit / b 0: Esta linha foi colocada para parar o diretório próprio argumento de ser processado. Se assim o desejar, remova esta linha.
Se o script é chamado com, digamos, c: \ temp \ , removendo essa linha mudaria o nome para c:. \ TEAP \ no final
com esta árvore de diretório:
.
├── 00v0w
│ ├── 12V0W
│ ├── 12d0w
│ └── 12v0d
├── 11V0W
├── 11d0w
└── 11v0d
renamer comandos:
$ renamer --regex --find '[vV]' --replace 'Y' '**'
$ renamer --regex --find '[wW]' --replace 'Z' '**'
produziria esta saída:
.
├── 00Y0Z
│ ├── 12Y0Z
│ ├── 12Y0d
│ └── 12d0Z
├── 11Y0Z
├── 11Y0d
└── 11d0Z