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

irvicon 10-11-2015 15:13 2573359

Архивация содержимого папки по размеру
 
Доброго времени суток!
Подскажите пожалуйста как при помощи CMD/BAT реализовать следующее:
В папке (input) лежат папки и файлы (все время разные по названию и немного отличаются по размеру 5-10КБ), например:
images\
files\
rss1.xml
robots.txt
sitemap.xml
sitemap58.php
sitemap57.php
sitemap56.php
sitemap55.php
...
art-218011.php

Требуется создать архивы по 7,5МБ+-1МБ.
Имя архива по названию родительской папки плюс порядковый номер, в итоге должно получиться примерно так:
input1.zip (содержит:
images\
files\
rss1.xml
robots.txt)

input2.zip (содержит:
sitemap.xml
sitemap58.php
sitemap57.php)

input3.zip (содержит:
sitemap56.php
sitemap55.php)

и т.д.

Если реализация по размеру архива 7,5МБ сложна в реализации - вполне подойдет:
берем из папки первые (100-200) файлов - пакуем их в input1.zip, следующие (100-200) в input2.zip и так пока не кончатся папки и файлы в папке input.

Заранее благодарен!

Iska 14-11-2015 14:40 2574632

irvicon, теоретически, то, что Вы просите, сделать в большинстве случаев возможно, но чересчур накладно. Чем Вас не устраивает обычный многотомный архив, который позволяют создавать и 7-Zip, и WinRAR, в том числе и в формате .zip (правда, каждый по-своему)?

irvicon 17-11-2015 21:04 2575873

Цитата:

Цитата Iska
сделать в большинстве случаев возможно, но чересчур накладно »

Согласен с вами, потому, что ответов не нашел ни в гугле... ни здесь - народ "абсолютно молча проходит мимо темы"
Цитата:

Цитата Iska
Чем Вас не устраивает обычный многотомный архив »

Мне их распаковывать в вебе на free хостинге, где архив не более 10 мб и многотомные архивы "не катят" =(

megaloman 18-11-2015 12:49 2576122

Вот маразматичное по скорости работы решение
Код:

@Echo Off
cls

Set "DirIn=E:\Games"
Set "DirArc=E:\Delete"
Set /A SMax=7500000


Set ARC="C:\Program Files\WinRAR\Rar.exe" a -r

Set "NArc=%Date:~6,4%%Date:~3,2%%Date:~0,2%_Input"

SetLocal EnableExtensions EnableDelayedExpansion

Set /A N=1

FOR /F "usebackq delims=" %%i IN (`dir "%DirIn%\" /b /A:-D /s 2^>nul`) DO (
        %ARC% "%DirArc%\%NArc%!N!.rar" "%%i" >nul
        FOR /F "usebackq delims=" %%j IN (`dir "%DirArc%\%NArc%!N!.rar" /b /A:-D /s`) DO (
                Echo %%~zj  %NArc%!N!.rar  %%i
                If %%~zj GTR %SMax% Set /A N=!N!+1
        )
)

Создаются архивы чуть более указанного размера папки E:\Games в папке E:\Delete (при условии что исходные файлы много меньше разрешенного размера архива) Написал для архиватора rar, но упаковщик можно применить любой - zip у меня не под руками да и редко я с ним работаю. Маразматичность - в вызове архиватора для упаковки каждого файла.

А если реализовывать второй ваш вариант
У rar есть ключ -N@<файл-список>, но почему-то мне в файл-списке не удаётся указывать полные (с путями) имена файлов, получается только для файлов в текущей папке.
А реально сделать более эффективно - скопировать исходные файлы порциями в промежуточную папку, и уж её архивировать со своим именем с последующим удалением.

Iska 18-11-2015 15:36 2576174

Цитата:

Цитата megaloman
Маразматичность - в вызове архиватора для упаковки каждого файла. »

Не наговаривайте на себя: это не маразматичность, это единственно возможный вариант.

Я так и вовсе предполагал так же добавлять по одному файлу, а при превышении размера архива выше заданного — ещё и удалять из него последний добавленный файл.

megaloman 18-11-2015 19:55 2576243

irvicon, Вы писали: файлы ... немного отличаются по размеру 5-10КБ, при этом размер архивов должны быть по 7,5МБ+-1МБ.

Итак, возмём за основу размер архива, например, 7500 Кб, средний размер файла, например, 10 Кб и, определим опытным путём, процент сжатия файлов архиватором - например, 80%. По видимому, этот процент не сильно меняется для Вашего набора файлов, так как ИМХО, характеристики файлов от случая к случаю не сильно отличаются, скорее всего они создаются одним и тем же софтом для одних и тех же целей.

Посчитаем, сколько файлов надо заархивировать, чтобы приблизительно получить архив заданной величины.
Куда-нибудь, например, в папку для временных файлов, по очереди будем переписывать исходные файлы вычисленными порциями с сохранением структуры папок, архивировать порцию и затем удалять заархивированную копию.
Работает существенно быстрее, чем мой предыдущий вариант, но, естественно, размер архива будет намного сильнее отличаться от заданного. Но, ИМХО, Вам важно не превысить максимально-допустимый размер, что вполне достижимо
в приведенном коде.

Код:

@Echo Off
cls

Set /A SMax=7500
Set /A SAve=10
Set /A Perc=80

Set /A NIn=%SMax%*100/SAve/Perc

rem Set /A NIn=111

Set "DirIn=E:\Games"
Set "DirArc=E:\Delete"

Set ARC="C:\Program Files\WinRAR\Rar.exe" a -r

Set "NArc=%Date:~6,4%%Date:~3,2%%Date:~0,2%_Input"

SetLocal EnableExtensions EnableDelayedExpansion

Call :OutTmp "%DirIn%"
cd /d "%Tmp%"

xcopy "%DirIn%\*.*" "%OTmp%\" /t /e /y  >nul

Set /A N=1
Set /A M=0

FOR /F "usebackq delims=" %%i IN (`dir "%DirIn%\" /b /A:-D /s 2^>nul`) DO (
        Call :OutTmp "%%i"
        Echo "%%i"
        Copy "%%i" "!OTmp!" >nul
        Set /A M=!M!+1
        If !M! GEQ %NIn% (
                Call :OutTmp "%DirIn%"
                echo !M!  %ARC% "%DirArc%\%NArc%!N!.rar" "!DTmp!\"
                %ARC% "%DirArc%\%NArc%!N!.rar" "!DTmp!\" >nul
                rd "%OTmp%" /s /q
                xcopy "%DirIn%\*.*" "%OTmp%\" /t /e /y >nul
                Set /A N=!N!+1
                Set /A M=0
        ) 
)

If NOT !M!==0 (
        Call :OutTmp "%DirIn%"
        echo !M!  %ARC% "%DirArc%\%NArc%!N!.rar" "!DTmp!\"
        %ARC% "%DirArc%\%NArc%!N!.rar" "!DTmp!\"  >nul
        rd "!OTmp!" /s /q
)

GoTo :Eof

:OutTmp
Set "DTmp=%~pnx1"
Set "DTmp=%DTmp:~1,999%"
Set "OTmp=%Tmp%%~pnx1"
GoTo :Eof


irvicon 19-11-2015 00:44 2576329

Цитата:

Цитата megaloman
Работает существенно быстрее, чем мой предыдущий вариант, но, естественно, размер архива будет намного сильнее отличаться от заданного. Но, ИМХО, Вам важно не превысить максимально-допустимый размер, что вполне достижимо в приведенном коде. »

Супер!!!
:cool: :oszone:
...но:
  1. архивируется полностью структура вложенных папок: E:\games\wot\site1
  2. хочется только содержимое папки site1
ps Если оставить как в примере e:\games в архивы все равно помещается папка games

megaloman 20-11-2015 08:35 2576844

В соответствии с Вашим техзаданием
Код:

@Echo Off
CLS

Set "P0=%~dp0"

Set /A SMax=7500
Set /A SAve=10
Set /A Perc=80

Set /A NIn=%SMax%*100/%SAve%/%Perc%

rem      Set /A NIn=111

Set "DirIn=E:\Games\Сокровища Монтесумы\Data"
Set "DirArc=E:\Delete"

Set ARC="C:\Program Files\WinRAR\Rar.exe" a -r

FOR /F "usebackq tokens=2,3,* delims=\" %%i IN ('%DirIn%') DO (
        Set "NArc=%Date:~6,4%%Date:~3,2%%Date:~0,2%_%%i"
        Set "NDir=%%i"
        Set "PDir=%%j\%%k"
        Set "PTmp=%Tmp%\%%i"
)

SetLocal EnableExtensions EnableDelayedExpansion

Call :OutTmp "%DirIn%"

xcopy "%DirIn%\*.*" "%OTmp%\" /t /e /y  >nul
cd /d "%PTmp%"

Set /A N=1
Set /A M=0
FOR /F "usebackq delims=" %%i IN (`dir "%DirIn%\" /b /A:-D /s 2^>nul`) DO (
        Call :OutTmp "%%i"
        Copy "%%i" "!OTmp!" >nul
        Set /A M=!M!+1
        If !M! GEQ %NIn% (
                Call :OutTmp "%DirIn%"
                echo !M! "%DirArc%\%NArc%!N!.rar" "%PDir%\"
                %ARC% "%DirArc%\%NArc%!N!.rar" "%PDir%\*.*" >nul
                rd "%OTmp%" /s /q
                xcopy "%DirIn%\*.*" "%OTmp%\" /t /e /y >nul
                Set /A N=!N!+1
                Set /A M=0
        ) 
)

If NOT !M!==0 (
        echo !M! "%DirArc%\%NArc%!N!.rar" "%PDir%\"
        %ARC% "%DirArc%\%NArc%!N!.rar" "%PDir%\*.*" >nul
)

cd /d "%P0%"
rd "%Tmp%\%NDir%" /s /q

GoTo :Eof

:OutTmp
Set "DTmp=%~nx1"
Set "OTmp=%Tmp%%~pnx1"
GoTo :Eof

Здесь вариант с максимальным приближением к архиву заданного размера
Код:

@Echo Off
cls

Set "DirIn=E:\Games\Сокровища Монтесумы\Data"
Set "DirArc=E:\Delete"
Set /A SMax=7500000


Set ARC="C:\Program Files\WinRAR\Rar.exe" a -r

FOR /F "usebackq tokens=2,3,* delims=\" %%i IN ('%DirIn%') DO (
        Set "NArc=%Date:~6,4%%Date:~3,2%%Date:~0,2%_%%i"
)

SetLocal EnableExtensions EnableDelayedExpansion

Set /A N=1

FOR /F "usebackq delims=" %%i IN (`dir "%DirIn%\" /b /A:-D /s 2^>nul`) DO (
        %ARC% "%DirArc%\%NArc%!N!.rar" "%%i" >nul
        FOR /F "usebackq delims=" %%j IN (`dir "%DirArc%\%NArc%!N!.rar" /b /A:-D /s`) DO (
                Echo %%~zj  %NArc%!N!.rar  %%i
                If %%~zj GTR %SMax% Set /A N=!N!+1
        )
)


irvicon 22-11-2015 23:10 2577859

Цитата:

Цитата megaloman
В соответствии »

все равно... архивирует содержимое папки games
те в архиве лишняя вложенность http://c2n.me/3qGOwkC
нужно чтобы при распаковке корень последней папки (обведено оранжевой рамкой)

megaloman 23-11-2015 11:05 2577988

irvicon, В Вашей постановке задачи
Цитата:

В папке (input) лежат папки и файлы (все время разные по названию и немного отличаются по размеру 5-10КБ), например:
images\
files\
rss1.xml
........
Цитата:

Требуется создать архивы ...
Имя архива по названию родительской папки плюс порядковый номер, в итоге должно получиться примерно так:
input1.zip (содержит:
images\
files\
rss1.xml
То есть, в архивах с именами Input1,2,3 ... Вы хотите иметь содержимое папки files, но при этом сохранить путь images\files\
Именно это и делается в моём скрипте:
Архив с именем Дата_Games1,2,3 ... содержит папку Сокровища Монтесумы\Data\ с сохранением пути. При этом никакие иные подпапки или файлы в папке Games не затрагиваются. При распаковке, естественно, получится папка с сохранёнными путями Сокровища Монтесумы\Data, при этом никакие иные посторонние подпапки нигде не фигурируют. Что не так?
Или Вы хотите, чтобы путь терялся и распаковывалась только самая нижняя из указанных папок Data\ ?

irvicon 23-11-2015 12:19 2578020

Цитата:

Цитата megaloman
Или Вы хотите, чтобы путь терялся и распаковывалась только самая нижняя из указанных папок Data\ ? »

да именно так

megaloman 23-11-2015 20:43 2578243

Вот так?
Код:

@Echo Off
CLS

Set "P0=%~dp0"

Set /A SMax=7500
Set /A SAve=10
Set /A Perc=80

Set /A NIn=%SMax%*100/%SAve%/%Perc%
echo %NIn%
rem Set /A NIn=111

Set "DirIn=E:\Games\Сокровища Монтесумы\Data"
Set "DirArc=E:\Delete"

Set ARC="C:\Program Files\WinRAR\Rar.exe" a -r

FOR /F "usebackq tokens=2,3,* delims=\" %%i IN ('%DirIn%') DO (
        Set "NArc=%Date:~6,4%%Date:~3,2%%Date:~0,2%-%%i"
        Set "NDir=%%i"
rem        Set "PDir=%%j\%%k"
        Set "PTmp=%Tmp%\%%i"
)

SetLocal EnableExtensions EnableDelayedExpansion

Call :OutTmp "%DirIn%"

xcopy "%DirIn%\*.*" "%OTmp%\" /t /e /y  >nul
cd /d "%OTmp%"
cd ..

Set "PDir=%DTmp%"

Set /A N=1
Set /A M=0
FOR /F "usebackq delims=" %%i IN (`dir "%DirIn%\" /b /A:-D /s 2^>nul`) DO (
        Call :OutTmp "%%i"
        Copy "%%i" "!OTmp!" >nul
        Set /A M=!M!+1
        If !M! GEQ %NIn% (
                Call :OutTmp "%DirIn%"
                echo !M! "%DirArc%\%NArc%!N!.rar" "%PDir%\"
                %ARC% "%DirArc%\%NArc%!N!.rar" "%PDir%\*.*" >nul
                rd "%OTmp%" /s /q
                xcopy "%DirIn%\*.*" "%OTmp%\" /t /e /y >nul
                Set /A N=!N!+1
                Set /A M=0
        ) 
)

If NOT !M!==0 (
        echo !M! "%DirArc%\%NArc%!N!.rar" "%PDir%\"
        %ARC% "%DirArc%\%NArc%!N!.rar" "%PDir%\*.*" >nul
)

cd /d "%P0%"
rd "%Tmp%\%NDir%" /s /q

GoTo :Eof

:OutTmp
Set "DTmp=%~nx1"
Set "OTmp=%Tmp%%~pnx1"
GoTo :Eof


irvicon 25-11-2015 10:27 2578706

Цитата:

Цитата megaloman
Вот так? »

:sorry: :oszone:
еще ниже = только корень

megaloman 25-11-2015 14:58 2578777

Ом мани падме хум :-)
Код:

@Echo Off
CLS

Set "P0=%~dp0"

Set /A SMax=7500
Set /A SAve=10
Set /A Perc=80

Set /A NIn=%SMax%*100/%SAve%/%Perc%
echo %NIn%
rem Set /A NIn=111

Set "DirIn=E:\Games\Сокровища Монтесумы\Data"
Set "DirArc=E:\Delete"

Set ARC="C:\Program Files\WinRAR\Rar.exe" a -r

FOR /F "usebackq tokens=2,3,* delims=\" %%i IN ('%DirIn%') DO (
        Set "NArc=%Date:~6,4%%Date:~3,2%%Date:~0,2%-%%i"
        Set "NDir=%%i"
        Set "PTmp=%Tmp%\%%i"
)

SetLocal EnableExtensions EnableDelayedExpansion

Call :OutTmp "%DirIn%"

xcopy "%DirIn%\*.*" "%OTmp%\" /t /e /y  >nul
cd /d "%OTmp%"

Set "PDir=%DTmp%"

Set /A N=1
Set /A M=0
FOR /F "usebackq delims=" %%i IN (`dir "%DirIn%\" /b /A:-D /s 2^>nul`) DO (
        Call :OutTmp "%%i"
        Copy "%%i" "!OTmp!" >nul
        Set /A M=!M!+1
        If !M! GEQ %NIn% (
                Call :OutTmp "%DirIn%"
                echo !M! "%DirArc%\%NArc%!N!.rar" "%PDir%\"
                %ARC% "%DirArc%\%NArc%!N!.rar" *.* >nul
                rd "%OTmp%" /s /q 2>nul
                xcopy "%DirIn%\*.*" "%OTmp%\" /t /e /y >nul
                Set /A N=!N!+1
                Set /A M=0
        ) 
)

If NOT !M!==0 (
        echo !M! "%DirArc%\%NArc%!N!.rar" "%PDir%\"
        %ARC% "%DirArc%\%NArc%!N!.rar" "*.*" >nul
)

cd /d "%P0%"
rd "%Tmp%\%NDir%" /s /q

GoTo :Eof

:OutTmp
Set "DTmp=%~nx1"
Set "OTmp=%Tmp%%~pnx1"
GoTo :Eof



Время: 05:32.

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