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

arioo7 04-01-2019 11:13 2849699

Рандомное копирование файлов по критерию
 
Прочесал форум, находил схожие задачи, но не видел конкретно такой.

Суть следующая. Есть папка с файлами. Нужно чтобы файлы внутри этой папки, рандомно разделились в группы по 5 файлов и раскидались в новые папки, согласно своим группам.
Т.е. Есть папка с 1500 файлами. Применяем к ней скрипт. В указанной директории создаётся 300 папок, в каждой из которых по 5 файлов выбранных случайно.

Рандом в данной операции играет важную роль.

Искренне надеюсь на вашу помощь.

YuS_2 04-01-2019 12:52 2849706

Цитата:

Цитата arioo7
Прочесал форум, находил схожие задачи, но не видел конкретно такой. »

Цитата:

Цитата arioo7
Рандом в данной операции играет важную роль. »

Цитата:

Цитата arioo7
Искренне надеюсь на вашу помощь. »

Рандом, конечно же, играет наиважнейшую роль в упорядочивании расположения файлов на диске, ага :biggrin:
За "изобретение" - 5, по предмету - 2. Профессор, конечно, лопух, но аппаратура при нём, при нём! :)
Помощь - предполагает наличие приложенных усилий, причем не для поиска готового решения, а приложенных усилий именно для решения задачи... есть внятные попытки решить задачу самостоятельно, студент?

megaloman 04-01-2019 19:57 2849795

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

@Echo Off
cls
        Set "BoxIn=Z:\Box_In"
        Set "Mask=*.*"
        Set "BoxOut=Z:\Box_Out"
        Set /A QQ=5

        Set /A Max=10000       

        Set /A N=%Max%
        FOR %%f IN ("%BoxIn%\%Mask%") DO Call :Count "%%~nxf"
       
        Set /A M=N
        Set /A i=0
        Set /A ND=%Max%

        Set /A QQQ=QQ+%Max%
        Set /A L=0

        :Begin
                Set /A j=%Random%
                Set /A j=%Max%+1+%j%-(%j%/(%N%-%Max%))*(%N%-%Max%)

                If %L%==0 If %i%==0 Set /A ND+=1
                If %L%==0 If %i%==0 Md "%BoxOut%\%ND%"
                Call :MyMove "F%j%" "%%F%j%%%" "%BoxIn%" "%BoxOut%\%ND%"||(Set /A L=1 &GoTo :Begin)
                Set /A L=0
                Set /A i+=1
                Set /A M-=1
                If %M% GTR %Max% If %i% LSS %QQ% GoTo :Begin
                Set /A i=0
                If %M% GTR %QQQ% GoTo :Begin
                If %M% GTR %Max% Set /A ND+=1
                If %M% GTR %Max% (Md "%BoxOut%\%ND%" & >nul Move "%BoxIn%\%Mask%" "%BoxOut%\%ND%\")
pause
GoTo :Eof

:Count
        Set /A N+=1
        Set "F%N%=%~1"
GoTo :Eof

:MyMove
        If %2=="" Exit /B 1
        Set "%~1="
        >nul Move /Y "%~3\%~2" "%~4\"
Exit /B 0


mwz 04-01-2019 23:42 2849853

Цитата:

Цитата YuS_2
Рандом, конечно же, играет наиважнейшую роль в упорядочивании расположения файлов на диске, ага »

А что, я тут как-то задавал чисто практический для меня вопрос: как к тысяче и более файлов приписать случайный числовой префикс, чтобы затем эти файлы можно было положить на флешку с FAT – т.е. чтобы при копировании на FAT по алфавиту они располагались там в случайном порядке относительно исходных имён. Результатом я был доволен. ;)

Iska 05-01-2019 00:06 2849857

Цитата:

Цитата mwz
А что, я тут как-то задавал чисто практический для меня вопрос: как к тысяче и более файлов приписать случайный числовой префикс »

Far Manager + Visual renaming files plugin, маска для имени — «[R]_[N]» ;).

mwz 05-01-2019 01:30 2849883

Iska, Да я и для TotalCmd позже нашёл плагин RandomWDX_1_0_1. Но ваше как раз решение батника пригодилось напрямую: надо было иметь пятизначные числа с лидирующими нулями в случае, если значность меньше. :)

Iska 05-01-2019 01:56 2849886

mwz, тут, увы, этого нет:
Цитата:

[R] Случайное число от 0 до 32767.
— просто число, достаточно ограниченное (можно, конечно, смультиплицировать сам шаблон), и без лидирующих нулей.

megaloman 05-01-2019 09:06 2849913

mwz,
Цитата:

тут как-то задавал чисто практический для меня вопрос: как к тысяче и более файлов приписать случайный числовой префикс
Уже не актуально?
В дополнение к решенной 5 лет назад задаче, еще вариант
Код:

@Echo Off
cls
        Set "BoxIn=Z:\Box_In\Alll"
        Set "Mask=*.*"

        Set /A Max=10000

        Set /A N=%Max%
        FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /A:-D /O:-D /T:C`) DO Call :Count "%%~nxf"
        FOR /F "usebackq tokens=1* delims==" %%f IN (`Set "@@"`) DO Call :MyRen "%BoxIn%\%%g" "%%g" %Max%

        Set /A N=%Max%
        FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn%\%Mask%" /B /A:-D /O:N`) DO Call :Count "%%~nxf"
        Set /A N=%Max%
        FOR /F "usebackq tokens=1* delims==" %%f IN (`Set "@@"`) DO Call :MyRen2 "%BoxIn%\%%g" "%%g" %Max%
pause
GoTo :Eof

:Count
        Set /A N+=1
        Set "@@%N%=%~1"
GoTo :Eof

:MyRen
        Set /A j=%Random%+%3
        Ren %1 "%j%_%~2"
Exit /B 0

:MyRen2
        Set /A N+=1
        Set "New=%~2"
        Ren %1 "%N%_%New:*_=%"
Exit /B 0

Если не требуется, чтобы префиксы никак не дублировались, красные строки можно удалить

YuS_2 05-01-2019 11:29 2849936

Цитата:

Цитата mwz
т.е. чтобы при копировании на FAT по алфавиту они располагались там в случайном порядке относительно исходных имён. »

Ну, это несколько другая задача, действительно, имеющая практическое значение. А у ТС-а, "чисто" непрактическая задача, т.е. задача на поиск решения, всего лишь. То бишь, в данном случае, суть задачи абсолютно неважна, важен поиск решения... а мы, предоставляя ему решение, тем самым оказываем медвежью услугу... увы.

mwz 05-01-2019 19:47 2850030

Цитата:

Цитата megaloman
Уже не актуально? »

Ну это ж была "конечная" задача, и развития её с самого начала не просматривалось: лежит тот батничек у меня в папке, в которой файлы периодически удаляются и добавляются, периодически перетряхиваю им последовательность, задачу свою выполняет, мы с женой довольны. :)

Но спасибо — посмотреть другие методы тоже бывает полезно.

arioo7 06-01-2019 09:23 2850108

Цитата:

Цитата megaloman
Как-то так »

Огромное спасибо, очень выручили, программа работает идеально!


Время: 19:13.

Время: 19:13.
© OSzone.net 2001-