Estou tentando renomear um monte de imagens (todas com extensão .jpg) com nomes alfanuméricos aleatórios. O exemplo seria 08kDRH1s.jpg
ou 0FwzUc3.jpg
. Fazendo algumas pesquisas, encontrei alguns scripts em lote usados, $RANDOM
mas são apenas valores entre 0 e 32767
Um usuário me indicou um script em lote que gera strings alfanuméricas aleatórias de 8 caracteres. Seria difícil ajustar isso para renomear arquivos apenas enviando os nomes para a linha de comando?
@Echo Off
Setlocal EnableDelayedExpansion
Set _RNDLength=8
Set _Alphanumeric=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
Set _Str=%_Alphanumeric%987654321
:_LenLoop
IF NOT "%_Str:~18%"=="" SET _Str=%_Str:~9%& SET /A _Len+=9& GOTO :_LenLoop
SET _tmp=%_Str:~9,1%
SET /A _Len=_Len+_tmp
Set _count=0
SET _RndAlphaNum=
:_loop
Set /a _count+=1
SET _RND=%Random%
Set /A _RND=_RND%%%_Len%
SET _RndAlphaNum=!_RndAlphaNum!!_Alphanumeric:~%_RND%,1!
If !_count! lss %_RNDLength% goto _loop
Echo Random string is !_RndAlphaNum!
Responder1
O script simples a seguir renomeará todos os arquivos .jpg na pasta atual para nomes alfanuméricos aleatórios de 8 caracteres, preservando a extensão .jpg. Observe que é possível que o gerador de nomes aleatórios produza um nome que já exista, portanto, o script faz um loop até gerar com êxito um nome exclusivo.
@echo off
setlocal disableDelayedExpansion
set "chars=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
for /f "eol=: delims=" %%F in ('dir /b /a-d *.jpg') do call :renameFile "%%F"
exit /b
:renameFile
setlocal enableDelayedExpansion
:retry
set "name="
for /l %%N in (1 1 8) do (
set /a I=!random!%%36
for %%I in (!I!) do set "name=!name!!chars:~%%I,1!"
)
echo if exist !name!.jpg goto :retry
endlocal & ren %1 %name%.jpg
Um pouco mais de código produz um utilitário versátil que permite especificar o caminho de origem e a máscara do arquivo, além de fornecer a opção de processar subdiretórios. O utilitário sempre preserva a extensão de cada arquivo. Tenha cuidado com este utilitário!
renomearArquivosRandom.bat
:: renameFilesRandom.bat [filter] [/s]
@echo off
setlocal disableDelayedExpansion
:: Parse and validate arguments
set "option="
set "filter="
if "%~3" neq "" (
>&2 echo ERROR: Too many arguments
exit /b 1
)
if /i "%~1" equ "/S" (set "option=/S") else if "%~1" neq "" set "filter=%~1"
if /i "%~2" equ "/S" (set "option=/S") else if "%~2" neq "" (
if defined filter (
>&2 echo ERROR: Only one filter allowed
exit /b 1
) else set "filter=%~2"
)
if "%filter:~0,1%" equ "/" (
>&2 echo ERROR: Invalid option %filter%
exit /b 1
)
if not defined filter set "filter=*"
:: Convert a directory filter into a file filter with wildcards
if exist "%filter%\" set "filter=%filter%\*"
:: Determine source if /S option not specified
set "src="
if not defined option for /f "eol=: delims=" %%F in ("%filter%") do set "src=%%~dpF"
:: Rename the specified files
set "chars=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
for /f "eol=: delims=" %%F in ('dir /a-d /b %option% "%filter%"') do call :renameFile "%%F"
exit /b
:renameFile
setlocal
if not defined src set "src=%~dp1"
set "old=%~nx1"
set "ext=%~x1"
setlocal enableDelayedExpansion
:retry
set "name="
for /l %%N in (1 1 8) do (
set /a I=!random!%%36
for %%I in (!I!) do set "name=!name!!chars:~%%I,1!"
)
if exist "!src!!name!!ext!" goto :retry
ren "!src!!old!" "!name!!ext!"
Abaixo estão alguns exemplos de uso.
Renomeie todos os arquivos no diretório atual:
renameFilesRandom
Renomeie todos os arquivos .jpg no diretório atual:
renameFilesRandom *.jpg
Renomeie todos os arquivos .jpg na pasta c:\test e todas as suas subpastas (recursiva):
renameFilesRandom c:\test\*.jpg /s
Responder2
@echo off
REM The length of the random file name.
Set _RNDLength=8
REM Alphanumeric characters from which to choose.
Set _Alphanumeric=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
SET _Str=%_Alphanumeric%987654321
REM Define the folder to be searched. This value will be used later
REM to build the full path to the file. This is necessary because we
REM are not using /S with the dir command.
SET folder=C:\Users\patrick.seymour\Pictures
REM Loop through all of the JPEGs in the specified folder.
for /f "tokens=*" %%a in ('dir /b "%folder%\*.jpg"') do (
SET RESULT=
SETLOCAL ENABLEDELAYEDEXPANSION
CALL :GetRandomName
echo Renaming "%folder%\%%a" to "!RESULT!.jpg"
ren "%folder%\%%a" "!RESULT!.jpg"
ENDLOCAL
)
GOTO :EOF
:GetRandomName
SET /A _Len=0
:_LenLoop
IF NOT "%_Str:~18%"=="" SET _Str=%_Str:~9%& SET /A _Len+=9& GOTO :_LenLoop
SET _tmp=%_Str:~9,1%
SET /A _Len=_Len+_tmp
Set _count=0
SET _RndAlphaNum=
:_loop
Set /a _count+=1
SET _RND=%Random%
Set /A _RND=_RND%%%_Len%
SET _RndAlphaNum=!_RndAlphaNum!!_Alphanumeric:~%_RND%,1!
If !_count! lss %_RNDLength% goto _loop
REM Echo Random string is !_RndAlphaNum!
SET RESULT=!_RndAlphaNum!
GOTO :EOF
REM EXIT /B
:EOF