Войти

Показать полную графическую версию : Архивация по маске


Skylear
30-07-2018, 21:06
привет всем.
имеем
1) 7Zip
2) Структуру папок - год/месяц/дата/заказ(ы)

задача:
1) необходимо запаковать с помощью скрипта все каталоги поотдельности, лежащие внутри папки "дата", - заказ001 (далее заказ002, 003....) в архив с сохранением имени "заказ001.7z" (002,003....)
2) удалить заархивированные папки, чтобы остались только архивы

должны получить структуру типа -
год1/месяц1/дата1/заказ001.7z
год2/месяц2/дата2/заказ001.7z

ну и так далее, собственно превратить в архивы все что ниже папки "дата"


в общем то вот этот скрипт

for /D %%i in (*.*) do "C:\Program Files\7-zip\7z.exe" a "%%i.7z" -mx9 "%%i"
pause

архивирует папки внутри одной папки, типа "дата1\заказ001" (002, 003), но только если его руками класть в папку "дата1", а папки с названием дат лежат в папке с названием "месяц1", можно указать маску хотя бы папки с названием дат, чтобы руками не класть скрипт

Busla
30-07-2018, 22:20
forfiles /S /P c:\temp /C "cmd /c if @isdir==TRUE (echo @relpath | findstr /R \"\.\\.*\\.*\\.*\\.*\"> nul && 7z a -sdel @path.zip @path\* && rmdir @path)"
регулярку лучше подогнать под используемый формат даты

Skylear
30-07-2018, 22:25
формат даты одинаков везде, типа "01.02.16"

Busla
30-07-2018, 22:47
2) Структуру папок - год/месяц/дата/заказ(ы) »
формат даты одинаков везде, типа "01.02.16" »
что-то не сходится и я не про точку или дробь вместо обратного слэша
или это 16 февраля 2001 года?

Skylear
30-07-2018, 22:58
1 февраля 2016 года.

формат структуры таков:
2015\февраль\01.02.15\заказ001
2015\февраль\01.02.15\заказ002
2016\апрель\01.04.16\заказ001

типа такого.
формат названия папки в виде даты такой)
в общем подкорректировал скрипт следущющим образом, работает

forfiles /S /P H:\SHARE2\test /C "cmd /c if @isdir==TRUE (echo @relpath | findstr /R \"\.\\.*\\.*\\.*\\.*\"> nul && c:\Progra~1\7-zip\7z.exe a -sdel @path.7z -mx9 @path\* && rmdir @path)"

pause

ругался на 7z, пришлось дописать путь, и изменил сжатие и формат архива, сейчас тестирую, вроде правильно все....


еще один момент, кроме папок с именами "заказов" рядом лежат еще просто файлы, типа *.jpg и др..
как в этот скрипт добавить команды, чтобы все эти файлы архивировались поотдельности в каждый архив?
типа файл:
"2015\февраль\01.02.15\картинка001.jpg" стал отдельным архивом.

и хорошо бы перед удалением исходной папки архиватор тестировал архив на ошибки, но это необязательно.)

Busla
31-07-2018, 10:22
Skylear, извиняюсь, решил, что подразумевается день месяца, а не дата полностью, а рекомендация моя касалась всего пути

как в этот скрипт добавить команды, чтобы все эти файлы архивировались поотдельности в каждый архив? »
почти никак - скорее, подобным образом сделать второй этап обработки, да и толку от сжатия jpeg очень мало - это уже очень эффективно сжатые данные

и хорошо бы перед удалением исходной папки архиватор тестировал архив на ошибки, но это необязательно.) »
уберите ключ -sdel, добавьте через && проверку архива, а к rmdir ключи /S и /Q
только надо понимать, что в таком случае процессы архивации и удаления будут разнесены во времени и совершенно независимы друг от друга

Skylear
31-07-2018, 10:36
вот накалякал типа такого скрипта, выполняется вроде.

Set BoxIn="H:\SHARE2\Архивы проектов дизайнеров\2016\Январь"


FOR /D /r %%F in ("*") DO (

pushd %CD%
cd %%F
FOR %%X in (*.rar, *.zip, *.7z) DO (
"C:\Program Files\7-zip\7z.exe" x "%%X" -y
)
popd

)

del /s %BoxIn%\*.zip
del /s %BoxIn%\*.rar
del /s %BoxIn%\*.7z


forfiles /S /P %BoxIn% /C "cmd /c if @isdir==TRUE (echo @relpath | findstr /R \"\.*\\.*\\.*\"> nul && c:\Progra~1\7-zip\7z.exe a -sdel @path.7z -mx9 @path\* && rmdir @path)"

Set "BoxIn1=H:\SHARE2\Архивы проектов дизайнеров\2016\Январь"
Set "Maska=*.tif"

Set "Arc="C:\Program Files\7-zip\7z.exe" a -mx9"

FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn1%\%Maska%" /b /s /a:-d`) DO (
Echo %%f
%Arc% "%%~f.7z" "%%f"
)

del /s "%BoxIn1%\"*.tif



Set "BoxIn2=H:\SHARE2\Архивы проектов дизайнеров\2016\Январь"
Set "Maska2=*.psd"

Set "Arc="C:\Program Files\7-zip\7z.exe" a -mx9"

FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn2%\%Maska2%" /b /s /a:-d`) DO (
Echo %%f
%Arc% "%%~f.7z" "%%f"
)

del /s "%BoxIn2%\"*.psd

Pause


1) разархивирует все архивы, которые есть в данной папке и ее подпапках
2) удаляет эти архивы, оставляя только файлы
3) делает архивацию папок, лежащих в "датах" (но одного месяца, в котором лежит скрипт)
4) удаляет исходники, оставляя архивы
5) архивирует оставшиеся файлы форматов psd и tif, которые найдет в папке и подпапках
6) удаляет файлы psd и tif


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




© OSzone.net 2001-2012