Войти

Показать полную графическую версию : Пакетное переиминования файлов


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 нумероваться как первыми ,хотя должны быть последними. Не подскажете как исправить?

Iska
12-09-2021, 15:48
Не должны: dir не знает иной сортировки, нежели лексикографическая (а в Вашем примере — вообще в порядке чтения из оглавления каталога: на NTFS будет по алфавиту, на FAT32 — по мере создания записей).

Publipor
12-09-2021, 16:09
Не должны: dir не знает иной сортировки, нежели лексикографическая (а в Вашем примере — вообще в порядке чтения из оглавления каталога: на NTFS будет по алфавиту, на FAT32 — по мере создания записей). »
Жаль. Тогда не подскажете выход с данной ситуации?

alpap
12-09-2021, 16:19
именовать файлы с лидирующими недостающими нулями по отношению к разрядности числа в имени
file001..file099
file-0001..file-1000
...

Iska
12-09-2021, 18:54
не подскажете выход с данной ситуации? »
Подскажу. Можете использовать файловый менеджер, поддерживающий а) алфавитно-числовую сортировку, которую применяет Проводник (начиная с 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

alpap
13-09-2021, 00:56
на 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
...

Iska
13-09-2021, 19:49
alpap, а что будет, если потом опять создадут image(1).png, image(2).png, …?

alpap
14-09-2021, 05:46
если потом опять »
мой код для причесывания, соответственно разово, а в дальнейшем надо создавать как положено. Но можно и повторить, если опять на грабли. Этот код найдет и переименует именно этот же файл, скажем так исправит его имя на правильное.
А, имеется ввиду что после причесывания наступаем на грабли в этой папке - ну надо не допускать ошибок, если доверили руль, надо не просто доехать, а и машину не разбить и не задавить никого.

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

alpap
15-09-2021, 01:34
по времени »
время может быть и сбито, а нумерация такая как необходимо да на большом количестве фото бывает ой как важна, пересматривай потом этот ворох чтобы уложить и переименовать как надо. А если не важна эта деталь или с датами все в порядке, то да, очень удобно, причем это можно повторять при надобности.

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)

Iska
15-09-2021, 10:12
Сторонний софт не заставите это делать. »
А сторонний ровно один — Проводник ;).




© OSzone.net 2001-2012