los nombres de archivo de cambio de nombre recursivo + nombres de carpeta con un archivo por lotes

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

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

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top