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= — копия"
)
|
Как-то так
Код:
@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
|
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
}
|
ivan456, DJ Mogarych,
Цитата:
Цитата for_needlife@vk
сделать перекидку по 3 фото в 1 папку? »
|
Вы решаете не ту задачу
|
megaloman,
Вы его фото то сами смотрели?))
Там на фото файлы в названиях которых дата и время. И нужно с одинаковыми рассортировать по папкам.
Просто выше bat файл делает это не по именам, а по дате создания файла, ну или можно сделать тоже самое по дате изменения.
Это тоже самое будет.
Можно ещё переписать немного и поставить условие, сортировать с такой то даты до такой.
А там он уже сам ручками может папки переименовать как ему угодно.
там время только подчеркнуто.
Выше мой скрипт как раз создает папки с временем, но без секунд. А ему и не нужны секунды, только что он писал по 3 файла ему нужно, а не все.
Может у него 10 снимков в одну минуту, и все они окажутся в одной папке.
|
ivan456, Не смею даже пытаться ограничивать Вашу свободу творчества, лишь бы в удовольствие, но про дату/время в задании ни гу-гу, нафантазировать можно всё что угодно, но еще раз: сделать перекидку по 3 фото в 1 папку.
Кстати, у меня сортируются от старых к новым, но при этом делается перемещение по заданному количеству файлов в папку. Будет пожелание по именам папок - буду решать проблемы по мере их поступления.
|
megaloman, часто люди пишут одну, а хотят другое))
Я на фото смотрел, что он там подчеркнул исходя из фото и сделал скрипт, правда я так из спортивного интереса его сделал))
Самому что то захотелось что нибудь сортировать на компе))
правда не знаю зачем)
Если у него 4тыс фото и там каждого фото например по 3шт, но в разное время по секундам, по минутам одинаково, то будет создано 1333 папки и в каждой будет по 3 фото.
Я бы тоже так сделал. Например если стоит камера и каждую минуту делает по 3 фото и сохраняет всё в кучу. То логично потом тысячи фото отсортировать по минутам.
|
ему надо группировать по сериям снимков, сделанным во временнОм интервале в несколько секунд. На фото 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.
© OSzone.net 2001-