Компьютерный форум 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=355459)

for_needlife@vk 04-07-2024 20:11 3028760

Как перекидывать много файлов в нужные мне папки&
 
Вложений: 2
Здравствуйте! Помогите пожалуйста.
В папке находится около 4 тыс фото и нужно, что бы каждые 3 фотографии перекидывались в 1 папку.
Приложил скрин, там схематично указал что я имею ввиду. Возможно ли такое сделать каким либо способом?
У меня уже имеется скрипт который перекидывает 1 файл только в 1 папку. Как раз помогли на этом форуме. Возможно из него получится сделать перекидку по 3 фото в 1 папку? Приложил его так же файлом и текстом ниже.

@setlocal enabledelayedexpansion&chcp 1251>nul
@set "d=bla bla"

@for %%i in (*.*) do @(
>nul robocopy . "!d!!s!" "%%i" /mov /ndl /nfl /njh /njs /xf "%~nx0"
set/a c+=1&if !c! geq 2 (set "s= — копия (!c!)") else set "s= — копия"
)

megaloman 05-07-2024 00:10 3028770

Как-то так
Код:

@Echo Off &Cls
        Set "BoxIn=Z:\Box_In"
        Set Mask="*.jpg"
        Set "BoxOut=Z:\Box_Out"
        Set /A n=3

        Pushd "%BoxIn%"||(Echo Folder "%BoxIn%\" not found &Pause &Exit /B 2)
       
        Set /A m=10000, i=0
        For /F "usebackq delims=" %%f In (`2^>nul Dir /B /A:-D /O:D %Mask%`) Do (
                Call :MyMove "%%f"
        )
Pause
Exit /B

:MyMove
        Set /A remain=%i%%%%n%
        If Not %remain% EQU 0 (>nul Move %1 "%Out%\" &Set /A i+=1 &Exit /B)
        Set /A m+=1
        Set "Out=%BoxOut%\%m:~1%"
        Md "%Out%" &Set /A i+=1
        >nul Move %1 "%Out%\"
Exit /B


ivan456 05-07-2024 01:07 3028773

for_needlife@vk, Можно ещё так сделать.
Сортировка файлов в папке куда вы положите bat-ник.
Создаются папки с датой и временем.
Скрытый текст
Код:

@echo off
setlocal EnableDelayedExpansion
set "source_folder=%~dp0"
set "script_name=%~nx0"

for %%A in ("%source_folder%*.*") do (
  if not "%%~nxA" == "!script_name!" (
    for /F "tokens=1,2,3 delims=/: " %%B in ("%%~tA") do (
      set "day=%%~tA"
      set "destination_folder=!source_folder!!day:~0,10!"
      mkdir "!destination_folder!"
      move "%%A" "!destination_folder!"
    )
  )
)

endlocal
pause



Либо вот так, включая вложенные папки:
Скрытый текст
Код:

@echo off
setlocal EnableDelayedExpansion
set "source_folder=%~dp0"
set "script_name=%~nx0"

for /R "%source_folder%" %%A in (*) do (
  if not "%%~nxA" == "!script_name!" (
    for /F "tokens=1,2,3 delims=/: " %%B in ("%%~tA") do (
      set "day=%%B-%%C-%%D"
      set "destination_folder=!source_folder!!day!"
      mkdir "!destination_folder!" >nul
      move "%%A" "!destination_folder!" >nul
    )
  )
)

endlocal
pause



Пример:
Скрытый текст

DJ Mogarych 05-07-2024 09:36 3028780

Powershell
Код:

$src = 'C:\temp\from\photo*.jpg'
$dest = 'C:\temp\to'

dir $src |group {$_.basename -replace '.*_'} |% {
    $f = "$dest\$($_.Name)"
    mkdir $f -ErrorAction SilentlyContinue > $null
    $_.group |mv -Destination $f
}


megaloman 05-07-2024 12:28 3028790

ivan456, DJ Mogarych,
Цитата:

Цитата for_needlife@vk
сделать перекидку по 3 фото в 1 папку? »

Вы решаете не ту задачу

ivan456 05-07-2024 14:17 3028793

megaloman,
Вы его фото то сами смотрели?))
Там на фото файлы в названиях которых дата и время. И нужно с одинаковыми рассортировать по папкам.
Просто выше bat файл делает это не по именам, а по дате создания файла, ну или можно сделать тоже самое по дате изменения.
Это тоже самое будет.
Можно ещё переписать немного и поставить условие, сортировать с такой то даты до такой.
А там он уже сам ручками может папки переименовать как ему угодно.

там время только подчеркнуто.
Выше мой скрипт как раз создает папки с временем, но без секунд. А ему и не нужны секунды, только что он писал по 3 файла ему нужно, а не все.
Может у него 10 снимков в одну минуту, и все они окажутся в одной папке.

megaloman 05-07-2024 14:26 3028794

ivan456, Не смею даже пытаться ограничивать Вашу свободу творчества, лишь бы в удовольствие, но про дату/время в задании ни гу-гу, нафантазировать можно всё что угодно, но еще раз: сделать перекидку по 3 фото в 1 папку.
Кстати, у меня сортируются от старых к новым, но при этом делается перемещение по заданному количеству файлов в папку. Будет пожелание по именам папок - буду решать проблемы по мере их поступления.

ivan456 05-07-2024 14:31 3028795

megaloman, часто люди пишут одну, а хотят другое))
Я на фото смотрел, что он там подчеркнул исходя из фото и сделал скрипт, правда я так из спортивного интереса его сделал))
Самому что то захотелось что нибудь сортировать на компе))
правда не знаю зачем)

Если у него 4тыс фото и там каждого фото например по 3шт, но в разное время по секундам, по минутам одинаково, то будет создано 1333 папки и в каждой будет по 3 фото.

Я бы тоже так сделал. Например если стоит камера и каждую минуту делает по 3 фото и сохраняет всё в кучу. То логично потом тысячи фото отсортировать по минутам.

Sham 08-07-2024 19:31 3028860

ему надо группировать по сериям снимков, сделанным во временнОм интервале в несколько секунд. На фото 0..1, а в реальности может и больше. Номер снимка до "@" не даёт гарантий правильности группировки, потому что камера может глючить и где-то серия не 3 снимка, а 2 к примеру. Группировка по минутам тоже. Конец предыдущей серии в начале минуты, а начало следующей в конце минуты, и получается в одной папке снимки из разных серий.

for_needlife@vk 10-07-2024 00:02 3028889

Извиняюсь что мог запутать по поводу даты и время снимков. Действительно, большинство снимков лежат с рандомными датами и числами, поэтому сортировать по ним наверное будет не столь удобно, поэтому в тексте про это не указал, а когда делал зарисовку про это подумал и решил вдруг будет возможность сделать и по таком алгоритму.
В любом случае ваши представленные варианты работают прекрасно, спасибо!

DJ Mogarych 10-07-2024 16:28 3028903

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

Проблема только в том, что если будет очень много файлов с совершенно одинаковым временем, то скрипт будет превышать максимально заданное количество файлов в одной папке. Но это уже другая задача, и вряд ли она актуальна для этого случая.


Время: 05:59.

Время: 05:59.
© OSzone.net 2001-