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

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Архивация содержимого папки по размеру

Ответить
Настройки темы
CMD/BAT - Архивация содержимого папки по размеру

Новый участник


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

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


Доброго времени суток!
Подскажите пожалуйста как при помощи 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.

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

Отправлено: 15:13, 10-11-2015

 

Ветеран


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

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


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

Отправлено: 14:40, 14-11-2015 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Новый участник


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

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


Цитата Iska:
сделать в большинстве случаев возможно, но чересчур накладно »
Согласен с вами, потому, что ответов не нашел ни в гугле... ни здесь - народ "абсолютно молча проходит мимо темы"
Цитата Iska:
Чем Вас не устраивает обычный многотомный архив »
Мне их распаковывать в вебе на free хостинге, где архив не более 10 мб и многотомные архивы "не катят" =(

Отправлено: 21:04, 17-11-2015 | #3


Ветеран


Contributor


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

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


Вот маразматичное по скорости работы решение
Код: Выделить весь код
@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@<файл-список>, но почему-то мне в файл-списке не удаётся указывать полные (с путями) имена файлов, получается только для файлов в текущей папке.
А реально сделать более эффективно - скопировать исходные файлы порциями в промежуточную папку, и уж её архивировать со своим именем с последующим удалением.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 18-11-2015 в 12:59.


Отправлено: 12:49, 18-11-2015 | #4


Ветеран


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

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


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

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

Отправлено: 15:36, 18-11-2015 | #5


Ветеран


Contributor


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

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


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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 19-11-2015 в 22:15.


Отправлено: 19:55, 18-11-2015 | #6


Новый участник


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

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


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

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

Отправлено: 00:44, 19-11-2015 | #7


Ветеран


Contributor


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

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


В соответствии с Вашим техзаданием
Код: Выделить весь код
@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
	) 
)

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 20-11-2015 в 15:22. Причина: Закомментировал отладочное данное rem Set /A NIn=111

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

Отправлено: 08:35, 20-11-2015 | #8


Новый участник


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

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


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

Отправлено: 23:10, 22-11-2015 | #9


Ветеран


Contributor


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

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


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\ ?

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Отправлено: 11:05, 23-11-2015 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Архивация содержимого папки по размеру

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBS/WSH/JS - Архивация папки в vbs and331 Скриптовые языки администрирования Windows 0 17-08-2013 15:15
Любой язык - Скрипт для распределения файлов по папкам кучками по n-ому размеру DmitryAnatolich Скриптовые языки администрирования Windows 9 06-05-2013 15:20
Доступ - Запрет на печать содержимого папки SanCho Microsoft Windows 7 3 15-05-2012 17:32
[решено] запрет просмотра содержимого папки dimds Microsoft Windows NT/2000/2003 4 25-03-2011 09:43
Ограничить размер содержимого папки clin Microsoft Windows NT/2000/2003 6 12-12-2008 13:55




 
Переход