Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6567
Благодарности: 1503

Профиль | Отправить PM | Цитировать


Powershell, с настраиваемым количеством файлов в конечной папке и разницей в секундах. Вроде работает.
Код: Выделить весь код
$src = 'C:\temp\from\photo*.jpg'
$dest = 'C:\temp\to'
$sec = 2 # максимально допустимая разница в секундах
$quantity = 3 # максимальное число файлов в конечных папках

function Get-Folder ($name) {
    $name -replace '^.*@'
}
function Get-Time ($name) {
    [datetime]::parseexact("$(Get-Folder $name)", 'dd-MM-yyyy_HH-mm-ss', $null)
}

$files = dir $src |sort {Get-Time $_.basename}
$filesNum = $files.count - 1

0..$filesNum |% {
    if (-not $continuationToken) {
        $f = "$dest\$(Get-Folder $files[$_].basename)"
        mkdir $f -ErrorAction SilentlyContinue > $null
    }
    mv $files[$_] $f
    $counter++
    #"Файл $($files[$_].name) перенесён в $f"

    if ($filesNum -eq $_) {break} # Чтобы не было ошибки на последнем файле

    $nextSec = ((Get-Time $files[$_+1].basename) - (Get-Time $files[$_].basename)).totalseconds
    #"Сек: $nextsec/$sec, кол-во: $counter/$quantity"
    if ($nextSec -le $sec -and $counter -lt $quantity) {
        #"Токен выдан`n"
        $continuationToken = 1
    }
    else {
        #"Токен не выдан`n"
        $continuationToken,$counter = $null
    }

    if ($counter -ge $quantity) {$counter = $null}
}
Пример со включённым логированием (в коде закомментировано) и с настройкой $sec = 3, $quantity = 4

Код: Выделить весь код
Файл photo_4362@30-06-2024_18-07-01.jpg перенесён в C:\temp\to\30-06-2024_18-07-01
Сек: 1/3, кол-во: 1/4
Токен выдан

Файл photo_4343@30-06-2024_18-07-02.jpg перенесён в C:\temp\to\30-06-2024_18-07-01
Сек: 0/3, кол-во: 2/4
Токен выдан

Файл photo_4344@30-06-2024_18-07-02.jpg перенесён в C:\temp\to\30-06-2024_18-07-01
Сек: 28/3, кол-во: 3/4
Токен не выдан

Файл photo_4345@30-06-2024_18-07-30.jpg перенесён в C:\temp\to\30-06-2024_18-07-30
Сек: 0/3, кол-во: 1/4
Токен выдан

Файл photo_4346@30-06-2024_18-07-30.jpg перенесён в C:\temp\to\30-06-2024_18-07-30
Сек: 1/3, кол-во: 2/4
Токен выдан

Файл photo_4347@30-06-2024_18-07-31.jpg перенесён в C:\temp\to\30-06-2024_18-07-30
Сек: 88/3, кол-во: 3/4
Токен не выдан

Файл photo_4348@30-06-2024_18-08-59.jpg перенесён в C:\temp\to\30-06-2024_18-08-59
Сек: 1/3, кол-во: 1/4
Токен выдан

Файл photo_4349@30-06-2024_18-09-00.jpg перенесён в C:\temp\to\30-06-2024_18-08-59
Сек: 1/3, кол-во: 2/4
Токен выдан

Файл photo_4350@30-06-2024_18-09-01.jpg перенесён в C:\temp\to\30-06-2024_18-08-59
Сек: 0/3, кол-во: 3/4
Токен выдан

Файл photo_4351@30-06-2024_18-09-01.jpg перенесён в C:\temp\to\30-06-2024_18-08-59
Сек: 54259201/3, кол-во: 4/4
Токен не выдан

Файл photo_4352@20-03-2026_18-09-02.jpg перенесён в C:\temp\to\20-03-2026_18-09-02
Полученная структура
Код: Выделить весь код
C:\TEMP\TO
+---20-03-2026_18-09-02
¦       photo_4352@20-03-2026_18-09-02.jpg
¦       
+---30-06-2024_18-07-01
¦       photo_4343@30-06-2024_18-07-02.jpg
¦       photo_4344@30-06-2024_18-07-02.jpg
¦       photo_4362@30-06-2024_18-07-01.jpg
¦       
+---30-06-2024_18-07-30
¦       photo_4345@30-06-2024_18-07-30.jpg
¦       photo_4346@30-06-2024_18-07-30.jpg
¦       photo_4347@30-06-2024_18-07-31.jpg
¦       
L---30-06-2024_18-08-59
        photo_4348@30-06-2024_18-08-59.jpg
        photo_4349@30-06-2024_18-09-00.jpg
        photo_4350@30-06-2024_18-09-01.jpg
        photo_4351@30-06-2024_18-09-01.jpg
Проблема только в том, что если будет очень много файлов с совершенно одинаковым временем, то скрипт будет превышать максимально заданное количество файлов в одной папке. Но это уже другая задача, и вряд ли она актуальна для этого случая.

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Последний раз редактировалось DJ Mogarych, 10-07-2024 в 18:05. Причина: DRY

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:28, 10-07-2024 | #11