2 votes

Renommer plusieurs fichiers & renuméroter les fichiers

J'ai de nombreux fichiers dans un dossier comme :

ConstantText1_variable_name_1_-_Constant_Text2_1233.png
ConstantText1_variable_name_1_-_Constant_Text2_1234.png
ConstantText1_variable_name_1_-_Constant_Text2_1235.png

ConstantText1_variable_name_2_-_Constant_Text2_1236.png
ConstantText1_variable_name_2_-_Constant_Text2_1237.png
ConstantText1_variable_name_2_-_Constant_Text2_1238.png
ConstantText1_variable_name_2_-_Constant_Text2_1239.png

ConstantText1_another_variable_name_3_-_Constant_Text2_1240.png
ConstantText1_another_variable_name_3_-_Constant_Text2_1241.png

Je voudrais les renommer pour qu'ils deviennent :

variable_name_1_01.png
variable_name_1_02.png
variable_name_1_03.png

variable_name_2_01.png
variable_name_2_02.png
variable_name_2_03.png
variable_name_2_04.png

another_variable_name_3_01.png
another_variable_name_3_02.png

J'ai essayé plusieurs scripts pour obtenir les noms de fichiers et manipuler les chaînes, mais je n'ai réussi avec aucun d'entre eux.
J'ai utilisé BulkRenameUtility et renommé chaque "variable_name" séparément, mais je préférerais utiliser une méthode plus efficace et facile. Merci.

1voto

Alexey Ten Points 121

Lors du traitement par lot :

@echo off
cls
setlocal enabledelayedexpansion
set number=1
set prevstr=*
for /f %%x in ('dir /b *.png') do (
    call :sub %%x
)
endlocal
goto :eof

:sub
set tmpstr=%1
set tmpstr=%tmpstr:ConstantText1_=%
set tmpstr=%tmpstr:_-_Constant_Text2_=*%
for /f "tokens=1 delims=*" %%x in ("%tmpstr%") do (
    if not %prevstr%==%%x ( 
        set number=1
        set prevstr=%%x
    )
    echo ren "%1" "%%x_!number!.png"
    set /a number+=1
)
exit /b

Y a-t-il un moyen d'obtenir les nombres rembourrés ? ex)[01, 02, ..., 09, 10] au lieu de [1, 2, ..., 9, 10] ?

Bien sûr. Regardez - j'utilise le rembourrage par zéro jusqu'à 3 chiffres, modifiez la quantité si nécessaire

@echo off
cls
setlocal enabledelayedexpansion
set number=1
set prevstr=*
for /f %%x in ('dir /b *.png') do (
    call :sub %%x
)
endlocal
goto :eof

:sub
set tmpstr=%1
set tmpstr=%tmpstr:ConstantText1_=%
set tmpstr=%tmpstr:_-_Constant_Text2_=*%
for /f "tokens=1 delims=*" %%x in ("%tmpstr%") do (
    if not %prevstr%==%%x ( 
        set number=1
        set prevstr=%%x
    )
:: rembourrage par zéro jusqu'à 3 chiffres, pour une autre longueur ajustez les 2 lignes suivantes en conséquence
    set padded=000!number!
    echo ren "%1" "%%x_!padded:~-3!.png"
    set /a number+=1
)
exit /b

0voto

dbenham Points 10555

Voici une solution qui repose sur deux scripts utilitaires batch/JScript hybrides :

  • JREN.BAT : Un utilitaire de renommage par expression régulière
  • JSORT.BAT : Un utilitaire de tri avec la capacité de ne retourner que des valeurs uniques

Les deux utilitaires sont des scripts purs qui s'exécutent nativement sur n'importe quelle machine Windows à partir de XP sans avoir besoin de fichiers exe de tiers.

Utilisez jren /? et jsort /? pour obtenir de l'aide sur les nombreuses options disponibles pour chaque utilitaire.

Le code suivant a fonctionné pour moi. Modifiez les définitions de txt1, txt2 et pad selon vos besoins.

@echo off
setlocal disableDelayedExpansion

set "txt1=TexteConstant1_"
set "txt2=_-_Texte_Constant2_"
set "pad=2"

call :escape txt1
call :escape txt2
set "find=^.*$"

for /f "eol=: delims=" %%A in (
  'jren "^%txt1regex%(.*)%txt2regex%.*\.png$" "$1" /i /list /fm "%txt1%*%txt2%*.png" ^| jsort /i /u'
) do (
  set "nm=%%A"
  set "fm=%txt1%%%A%txt2%*.png"
  setlocal enableDelayedExpansion
  call jren "!find!" "'!nm!_'+$n+'.png'" /j /npad %pad% /fm !fm!
  endlocal
)
exit /b

:escape
setlocal enableDelayedExpansion
set "txt=!%~1!"
set "txt=!txt:.=\.!"
set "txt=!txt:{=\{!"
set "txt=!txt:[=\[!"
set "txt=!txt:^^=\^^!"
set "txt=!txt:$=\$!"
set "txt=!txt:+=\+!"
set "txt=!txt:(=\(!"
set "txt=!txt:)=\)!"
endlocal & set "%~1regex=%txt%"
exit /b

Voici un exemple de sortie montrant que le script ci-dessus a fonctionné avec les noms de fichiers d'exemple. J'ai appelé le script "test.bat"

C:\test\renameTest>dir
 Volume in drive C has no label.
 Volume Serial Number is 5ED1-638E

 Directory of C:\test\renameTest

02/27/2020  11:23 PM

0voto

Keith Miller Points 6004

Lorsque vous êtes prêt à explorer PowerShell :

$Dossier = $pwd.path   ### Modifier au besoin. C'est l'emplacement actuel.
$CT1 = 'TexteConstant1_'
$CT2 = '_TexteConstant2_'
Get-ChildItem $Dossier *.png -File | ForEach{
    $_.BaseName -replace $CT1 -replace $CT2 -match '^(\w+)\-(\d+)$' | out-null
    [PSCustomObject]@{
        'Chemin'     = $_.FullName
        'NomBase' = $matches[1]
        'Index'    = $matches[2]
    }
} | Group BaseName | ForEach {
    [ref]$i = 1
    $_.Group | Sort Index | 
        Rename-Item -NewName { '{0}{1:00}.png' -f $_.BaseName, $i.Value++ }
}

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X