Показать полную графическую версию : Пакетное переиминования файлов
Publipor
12-09-2021, 14:52
Добрый день.Нужна помощь в доработке скрипта. В данной теме полный 0, но нет времени для полно изучения.
@for /f "delims=" %%i in ('"dir /a-d/b *.png"') do @set /a n+=1& cmd /v:on /c ren "%%i" !n!.png
Проблема такая https://ibb.co/DfnVkSq При создании нового имени для данных файлов, файлы с наименованием image(10).png, image(11).png нумероваться как первыми ,хотя должны быть последними. Не подскажете как исправить?
Не должны: dir не знает иной сортировки, нежели лексикографическая (а в Вашем примере — вообще в порядке чтения из оглавления каталога: на NTFS будет по алфавиту, на FAT32 — по мере создания записей).
Publipor
12-09-2021, 16:09
Не должны: dir не знает иной сортировки, нежели лексикографическая (а в Вашем примере — вообще в порядке чтения из оглавления каталога: на NTFS будет по алфавиту, на FAT32 — по мере создания записей). »
Жаль. Тогда не подскажете выход с данной ситуации?
именовать файлы с лидирующими недостающими нулями по отношению к разрядности числа в имени
file001..file099
file-0001..file-1000
...
не подскажете выход с данной ситуации? »
Подскажу. Можете использовать файловый менеджер, поддерживающий а) алфавитно-числовую сортировку, которую применяет Проводник (начиная с Windows XP), б) переименование с заданными возможностями. Из известных мне — это Far Manager+плагин Visual Renaming files и Total Commander (возможность группового переименования идёт в комплекте — Ctrl-M).
Но лучше зараз:
именовать файлы с лидирующими недостающими нулями по отношению к разрядности числа в имени »
megaloman
12-09-2021, 22:16
именовать файлы с лидирующими недостающими нулями по отношению к разрядности числа в имени » set /a n=1000
@for /f "delims=" %%i in ('"dir /a-d/b *.png"') do @set /a n+=1& cmd /v:on /c ren "%%i" !n:~-3!.png
на PowerShell
$d = 'C:\Papka'
sl $d
Switch -Regex ((gci -af .).Name) {
'^image\((\d+)\)\.png$' {
rni $Matches[0] ($Matches[0] -Replace $Matches[1], $('{0:d3}' -f [int]$Matches[1]))
}
}
будет переименовывать не подряд общим чохом, а именно:
image(10).png в image(010).png
image(1).png в image(001).png
...
alpap, а что будет, если потом опять создадут image(1).png, image(2).png, …?
если потом опять »
мой код для причесывания, соответственно разово, а в дальнейшем надо создавать как положено. Но можно и повторить, если опять на грабли. Этот код найдет и переименует именно этот же файл, скажем так исправит его имя на правильное.
А, имеется ввиду что после причесывания наступаем на грабли в этой папке - ну надо не допускать ошибок, если доверили руль, надо не просто доехать, а и машину не разбить и не задавить никого.
megaloman
14-09-2021, 10:00
а что будет, если потом опять создадут image(1).png, image(2).png, …? »Ключевое слово: потом. Всё таки, ИМХО, надо не отвечать на вопрос, как он поставлен, а пытаться въехать в задачу. ИМХО (мои домыслы) второй файл не может быть создан ранее первого. Поэтому надо не изменять то, что в скобках (1) (2) и т д., а переименовывать все файлы чохом в сортировке по времени@Echo Off
cls
Set "BoxIn=Z:\Box_In"
Set "Name=тра ля ля"
Set "Ext=png"
Set /A Len=4
Pushd "%BoxIn%" ||(Echo Folder "%BoxIn%" not found &Pause &Exit /B 1)
Set /A Num=100000000
For /F "usebackq tokens=2 delims=()" %%n In (`2^>nul Dir "%BoxIn%\%Name%(*).%Ext%" /B /A:-D /O:D`) Do (
Set /a Num+=1
Call Ren "%Name%(%%n).%Ext%" "tmp.%Name%(%%Num:~-%Len%%%).%Ext%"
)
For /F "usebackq tokens=1* delims=." %%i In (`2^>nul Dir "%BoxIn%\tmp.%Name%(*).%Ext%" /B /A:-D`) Do Ren "tmp.%%j" "%%j"
Popd
Pause
Exit /B
по времени »
время может быть и сбито, а нумерация такая как необходимо да на большом количестве фото бывает ой как важна, пересматривай потом этот ворох чтобы уложить и переименовать как надо. А если не важна эта деталь или с датами все в порядке, то да, очень удобно, причем это можно повторять при надобности.
megaloman
15-09-2021, 09:54
время может быть и сбито, а нумерация такая как необходимо да на большом количестве фото бывает ой как важна, пересматривай потом этот ворох чтобы уложить и переименовать как надо. »@Echo Off
cls
Set "BoxIn=Z:\Box_In"
Set "BoxOut=Z:\Box_In\Renum"
Set "Name=image"
Set "Ext=png"
Set /A Len=4
Pushd "%BoxIn%" ||(Echo Folder "%BoxIn%" not found &Pause &Exit /B 1)
Call :Add "%BoxOut%\%Name%(*).%Ext%" "Add"
For /F "usebackq tokens=2 delims=()" %%n In (`2^>nul Dir "%BoxIn%\%Name%(*).%Ext%" /B /A:-D /O:D`) Do (
Set /a Num=%%n+%Add%
Call Set "Num=00000000%%Num%%"
Call >nul Move "%Name%(%%n).%Ext%" "%BoxOut%\%Name%(%%Num:~-%Len%%%).%Ext%"
)
Popd
Pause
Exit /B
:Add
SetLocal
For /F "usebackq tokens=2 delims=()" %%n In (`2^>nul Dir %1 /B /A:-D /O:-N`) Do Set "NN=%%n" &GoTo :Add1
2>&1 Md "%~dp1"
EndLocal &Set /A %~2=0
Exit /B 0
:Add1
If "%NN:~0,1%"=="0" Set "NN=%NN:~1%" &GoTo :Add1
EndLocal &Set /A %~2=%NN%
Exit /B
а что будет, если потом опять создадут image(1).png, image(2).png, …? »Вновь созданные 1 2 3 ... будут перемещены в ту другую папку с продолжением нумерации к имеющимся там файлам.
мой код для причесывания, соответственно разово, а в дальнейшем надо создавать как положено. »Сторонний софт не заставите это делать.
Move c изменением имени работает (проверил и в XP) (http://forum.oszone.net/post-2966664-4.html)
Сторонний софт не заставите это делать. »
А сторонний ровно один — Проводник ;).
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.