Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Нумерация файлов в папке (http://forum.oszone.net/showthread.php?t=355040)

UnrulyAngel 13-03-2024 14:15 3025337

Нумерация файлов в папке
 
Здравствуйте, прошу помощи, исходные данные такие:

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 3025340

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

UnrulyAngel 13-03-2024 14:57 3025341

Цитата:

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

Да, но в названии после "k" может быть и 4 и 6 цифр, это артикул, т.е. опираемся на ту цифру, что после нижнего подчеркивания

Sham 13-03-2024 15:01 3025342

А если переименование вызовет коллизию? Циферку меняем, а такой файл в папке уже существует.

UnrulyAngel 13-03-2024 15:42 3025346

Цитата:

Цитата Sham
А если переименование вызовет коллизию? Циферку меняем, а такой файл в папке уже существует. »

заменяем, мне важно, чтобы была нумерация без прерываний, может переименовывание провести в 2 этапа, например сперва после _ поставить a,b,c,d и тд (более 25 не будет), а потом пройтись и пронумеровать, тут вам виднее наверно, я в этом не сильна ))

Sham 13-03-2024 17:33 3025350

тестируйте
Код:

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 3025351

Огромное спасибо!

DJ Mogarych 13-03-2024 18:00 3025352

Подразумевается, что файлы 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 3025367

Код:

@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 3025821

Всем спасибо, очень выручили и сэкономили много часов времени, обожаю вас!


Время: 04:46.

Время: 04:46.
© OSzone.net 2001-