los nombres de archivo de cambio de nombre recursivo + nombres de carpeta con un archivo por lotes
-
23-08-2019 - |
Pregunta
Me gusta crear un archivo por lotes (WinXP cmd) que va recursivamente a través de una carpeta y subcarpetas eligieron y cambia el nombre de los archivos que hay + carpetas con las siguientes reglas:
de todos los nombres de los archivos de la carpeta +, + mayúsculas minúsculas "V" y las letras "W" necesitan ser reemplazadas con las letras "Y" y "Z".
por ejemplo. 11V0W debe convertirse en 11Y0Z.
creo que es posible con A / R pero ¿cómo? Creo que es necesario que haya una subrutina que se llama que comprueba cada letra de uno en uno, además de la repetición básica con FOR / R.
Solución
La siguiente lote hace esto por los nombres de los archivos, por lo menos. Los directorios son un poco más complicado (por lo menos yo no podía llegar a una solución no infinita hasta el momento):
@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
Pero en teoría no debería ser demasiado difícil para virar dir el cambio de nombre a esto.
Otros consejos
Tom, perder el tiempo con un guión previo que he publicado, aquí es uno de procesamiento de todos los archivos y subdirectorios:
recurename.cmd directorio
@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 es un script no destructivo, quitar el echo en los comandos correctos con el fin de cambiar el nombre de cualquier archivo / directorio. ( mover echo y echo s )
Set = Reemplaza: Establecer esta variable a lo pares lo que necesita cambiarse.
set = startdir: que quería conseguir, de alguna manera, el argumento y tomando sólo la ruta de ella. Si un archivos se da como un parámetro, se procesarán todo el directorio contenedor y subdirectorios.
si "% ~ 1" == "% startdir: ~ 0, -1%" salida / b 0: Esta línea fue colocado para detener el directorio argumento mismo de ser procesada. Si lo desea, elimine esta línea.
Si el script se llama con, por ejemplo, c: \ temp \ , la eliminación de esta línea cambiaría el nombre a c: \. PETE \ en el extremo
con este árbol de directorios:
.
├── 00v0w
│ ├── 12V0W
│ ├── 12d0w
│ └── 12v0d
├── 11V0W
├── 11d0w
└── 11v0d
Renamer comandos:
$ renamer --regex --find '[vV]' --replace 'Y' '**'
$ renamer --regex --find '[wW]' --replace 'Z' '**'
producirían esta salida:
.
├── 00Y0Z
│ ├── 12Y0Z
│ ├── 12Y0d
│ └── 12d0Z
├── 11Y0Z
├── 11Y0d
└── 11d0Z