Войти

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


UnrulyAngel
13-03-2024, 14:15
Здравствуйте, прошу помощи, исходные данные такие:

1. есть общая папка: "k12345"
2. в этой папке есть еще 2-3: "подпапка 1", "подпапка 2" и тд.
3. в этих подпапках лежат файлы .png с названиями:
k12345_1.png
k12345_2.png
k12345_4.png
k12345_6.png

нужен .bat или .ps1, который мы кладем в папку "k12345" и при выполнении которого файлы в подпапках формата .png нумеруются корректно, а именно:
k12345_1.png
k12345_2.png
k12345_3.png
k12345_4.png

Заранее прошу прощения, если что-то не так описала, буду очень благодарна за помощь!

Sham
13-03-2024, 14:51
Вот например. В подпапках есть файлы определённого формата k<пять_цифр>_<цифра>.png. Нужно отсортировать эти файлы по <цифре> и переименовать эти файлы, изменив эту <цифру> на цифру, равную порядковому номеру файла в отсортированном списке файлов подобного формата в подпапке. Правильное условие?

UnrulyAngel
13-03-2024, 14:57
Вот например. В подпапках есть файлы определённого формата k<пять_цифр>_<цифра>.png. Нужно отсортировать эти файлы по <цифре> и переименовать эти файлы, изменив эту <цифру> на цифру, равную порядковому номеру файла в отсортированном списке файлов подобного формата в подпапке. Правильное условие? »
Да, но в названии после "k" может быть и 4 и 6 цифр, это артикул, т.е. опираемся на ту цифру, что после нижнего подчеркивания

Sham
13-03-2024, 15:01
А если переименование вызовет коллизию? Циферку меняем, а такой файл в папке уже существует.

UnrulyAngel
13-03-2024, 15:42
А если переименование вызовет коллизию? Циферку меняем, а такой файл в папке уже существует. »
заменяем, мне важно, чтобы была нумерация без прерываний, может переименовывание провести в 2 этапа, например сперва после _ поставить a,b,c,d и тд (более 25 не будет), а потом пройтись и пронумеровать, тут вам виднее наверно, я в этом не сильна ))

Sham
13-03-2024, 17:33
тестируйте get-childitem $PSScriptRoot -Directory | % {
$dir = $_; $count = 0;
$dir | get-childitem -File | % {
if ($_.Name -match '^(k\d+_)(\d+)(\.png)$') {
[pscustomobject]@{ N = [int]$matches[2]; M = $matches; O = $_; }
}
} | sort-object 'N' | % { ++$count;
while (test-path ($newpath = join-path $dir.fullname ($name = $_.M[1] + $count + $_.M[3]))) {
if ($_.O.fullname -eq $newpath) { return }
++$count;
}
'rename: {0} -> {1}' -f $_.O.fullname, $name
$_.O.MoveTo($newpath);
}
}

UnrulyAngel
13-03-2024, 17:54
Огромное спасибо!

DJ Mogarych
13-03-2024, 18:00
Подразумевается, что файлы k12345 имеются в разных подпапках.

$tmpAdd = "tmpp"
$c = 1

dir $PSScriptRoot -Recurse -Include "*.png" |% {
Rename-Item $_ -NewName "$($tmpAdd + $_.name)"
}

dir $PSScriptRoot -Recurse -Include "*.png" |sort {[int]($_.basename -replace '\D')} |% {
Rename-Item $_ -NewName "$(($_.basename -replace "\d+$","$c" -replace "^($tmpAdd)+") + $_.Extension)"
$c++
}

megaloman
14-03-2024, 10:28
@Echo Off &Cls
>nul Chcp 1251
Set "BoxIn=Z:\Box_In"
Set "BoxShr=k12345"
Set Mask="%BoxShr%_*.png"

Set "BoxAdd=Z:\Soft_Arc\123"
Set Arc="C:\Program Files\7-Zip\7z.exe" a -mx9 "Z:\Box_Arc\archive.7z"

Set /A M=0
Pushd "%BoxIn%\%BoxShr%" || (Echo Folder "%BoxIn%\%BoxShr%" not found &Pause &Exit /B 2)
For /R "%BoxIn%\%BoxShr%" %%f In ("%Mask%") Do (
Set /A M+=1
Call Set "@@@%%M%%=Ren "%%f.tmp" "%BoxShr%_%%M%%%%~xf""
Ren "%%f" "%%~nxf.tmp"
)
For /F "usebackq tokens=2 delims==" %%f In (`2^>nul Set "@@@"`) Do %%f
Popd
Pause
Exit /B 0

UnrulyAngel
27-03-2024, 00:08
Всем спасибо, очень выручили и сэкономили много часов времени, обожаю вас!




© OSzone.net 2001-2012