Пакетное переиминования файлов
Добрый день.Нужна помощь в доработке скрипта. В данной теме полный 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 — по мере создания записей).
|
Цитата:
Цитата Iska
Не должны: dir не знает иной сортировки, нежели лексикографическая (а в Вашем примере — вообще в порядке чтения из оглавления каталога: на NTFS будет по алфавиту, на FAT32 — по мере создания записей). »
|
Жаль. Тогда не подскажете выход с данной ситуации?
|
именовать файлы с лидирующими недостающими нулями по отношению к разрядности числа в имени
file001..file099
file-0001..file-1000
...
|
Цитата:
Цитата Publipor
не подскажете выход с данной ситуации? »
|
Подскажу. Можете использовать файловый менеджер, поддерживающий а) алфавитно-числовую сортировку, которую применяет Проводник (начиная с Windows XP), б) переименование с заданными возможностями. Из известных мне — это Far Manager+плагин Visual Renaming files и Total Commander (возможность группового переименования идёт в комплекте — Ctrl-M).
Но лучше зараз:
Цитата:
Цитата alpap
именовать файлы с лидирующими недостающими нулями по отношению к разрядности числа в имени »
|
|
Цитата:
Цитата alpap
именовать файлы с лидирующими недостающими нулями по отношению к разрядности числа в имени »
|
Код:
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(0 10).png
image( 1).png в image(00 1).png
...
|
alpap, а что будет, если потом опять создадут image(1).png, image(2).png, …?
|
мой код для причесывания, соответственно разово, а в дальнейшем надо создавать как положено. Но можно и повторить, если опять на грабли. Этот код найдет и переименует именно этот же файл, скажем так исправит его имя на правильное.
А, имеется ввиду что после причесывания наступаем на грабли в этой папке - ну надо не допускать ошибок, если доверили руль, надо не просто доехать, а и машину не разбить и не задавить никого.
|
Цитата:
Цитата Iska
а что будет, если потом опять создадут 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
|
время может быть и сбито, а нумерация такая как необходимо да на большом количестве фото бывает ой как важна, пересматривай потом этот ворох чтобы уложить и переименовать как надо. А если не важна эта деталь или с датами все в порядке, то да, очень удобно, причем это можно повторять при надобности.
|
Цитата:
Цитата alpap
время может быть и сбито, а нумерация такая как необходимо да на большом количестве фото бывает ой как важна, пересматривай потом этот ворох чтобы уложить и переименовать как надо. »
|
Значит, надо переименованные файлы перемещать в другую папку.
Код:
@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
Цитата:
Цитата Iska
а что будет, если потом опять создадут image(1).png, image(2).png, …? »
|
Вновь созданные 1 2 3 ... будут перемещены в ту другую папку с продолжением нумерации к имеющимся там файлам.
Цитата:
Цитата alpap
мой код для причесывания, соответственно разово, а в дальнейшем надо создавать как положено. »
|
Сторонний софт не заставите это делать.
Move c изменением имени работает (проверил и в XP)
|
Цитата:
Цитата megaloman
Сторонний софт не заставите это делать. »
|
А сторонний ровно один — Проводник ;).
|
Время: 13:34.
© OSzone.net 2001-