Скрипт кнопки для частичного бэкапа и архивирования

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: d-view, Моторокер, Avada, CaptainFlint, Nik

Ответить
Jonmey
Сообщения: 59
Зарегистрирован: Пн сен 27, 2010 14:01

Скрипт кнопки для частичного бэкапа и архивирования

Сообщение Jonmey »

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

Требуется скрипт, который делает с выделенными папками следующее

1. Создает файл контрольных сумм (напр. MD5) всех файлов и подпапок каждой из папок (отдельный для содержимого каждой из папок верхнего уровня), располагая его внутри каждой из папок верхнего уровня.

2. Архивирует согласно списку расширений файлы из каждой папки верхнего уровня (вклячая подпапки) в отдельный архив. То есть нужно архивировать не все содержимое папок верхнего уровня, а только файлы с указанными в списке расширениями.

3. Перемещает эти архивы в одноименноые с папками верхнего уровня папки, которые воссоздаются в противоложной панели ТС.

В результате работы скрипта на противоположной панели ТС должен появиться список папок идентичный выделенному в другой панели, а в каждой их этих папок будет находиться по одному архиву с файлами.

И все это соотвественно нужно повесить на одну кнопку.

Если найдутся желающие помочь, я был бы очень рад.
Аватара пользователя
Вахмурка
Сообщения: 2587
Зарегистрирован: Пн дек 27, 2004 14:47
Откуда: Большая деревня Москва
Контактная информация:

Сообщение Вахмурка »

1. Пошукай в сети разные программы для резервного копирования - их там пруд пруди. Некоторые - очень мощные, снабженные различными опциями архивирования, переименования, управления уровнями вложенности, контрольными суммами, и т.д. Я их тоже когда-то перепробовал много, пока не нашел (см. п. 2);
2. Xxcopy - универсальная программа для управления файлами и директориями вообще и для их резервного копирования в частности. Описать любимую программу я позволил себе здесь. Xxcopy - конструктор: что захочешь, то и сделаешь. Правда, она не умеет считать контрольные суммы и архивировать, но это легко реализуется сторонними утилитами. Не секрет, что специализированная програма-архиватор делает это быстрее, качественнее и универсальнее, чем комбайн из п. 1.
3. PowerPro, хотя она создана несколько для другого, но настолько мощна, что справится и с поставленной задачей.
4. Если подобные задачи перед тобой встают частенько, есть смысл изучить что-нибудь: ту же XXcopy, PowerPro, vbs или хотя бы батники. Тогда при мало-мальском изменении целей (скажем,понадобится ограниичить копируемые файлы по дате создания), не придется приставать к спецам, а сделать все самому.
5. Если ни один из вариантов не подходит, жди наших добрых писателей - Batya и Tol!k'а. Хотя батники, которые мастерски пишет последний, сами не умеют архивировать, а вызывают внешние архиваторы.
Желаю удачи.
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Тут алгоритм неточный. Должно быть как-то так:
1) Создание одноимённых выделенным папок в другой панели.
2) Подсчёт сумм файлов из каждой выделенной папки.
3) Упаковка файлов, содержащихся в каждой из выделенной папки, с указанием пути одноимённой папки из другой панели.
4) Перемещение каждого md5-файла в соответствующие папки другой панели.
Jonmey
Сообщения: 59
Зарегистрирован: Пн сен 27, 2010 14:01

Сообщение Jonmey »

Вахмурка
Спасибо за советы, но пока мои способности не позволяют написать самаостоятельно единый скрипт для этой задачи. А разбивать ее на несколько скриптов нет смысла - манипулятивно-временные затраты почти те же. Дело в том, что это не разовая операция, а регулярная, и время ее проведения, частота и количество папок произвольно. То есть это может быть и одна папка и несколько. Но всего папок много (пару тысяч).

Flasher
Я написал схему так, как я это делаю вручную. Как это будет делать скрипт - без разницы. Главное, что бэкапятся (архивируются) только те файлы, которые есть в списке допустимых типов файлов, а контролиные суммы считаются для всех файлов в каждой исходной папке, но при этом контрольная сумма считается, так как она считается находясь внутри папки верхнего уровня штатной коммандой TC (для сохранения относительных путей).
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

Код: Выделить всё

@echo off &chcp 1251 >nul
setlocal enableextensions

set "src=c:\src\"
set "dest=d:\dest\"
set "exts=doc xls bmp"

for /d %%d in ("%src%*") do (
cd /d %%d
rhash.exe -r -M --ansi *.* >"%%~nd.md5"
for %%e in (%exts%) do (
  zip.exe -R -S -q %%e.zip *.%%e
  if not exist "%dest%%%~nd" md "%dest%%%~nd"
  move %%e.zip "%dest%%%~nd"
)
)

rem rhash: http://sourceforge.net/projects/rhash/files/
rem zip: ftp://ftp.info-zip.org/pub/infozip/win32/

Для более тесного использования с ТС

Код: Выделить всё

rem set "src=c:\src\" 
rem set "dest=d:\dest\" 
rem set "exts=doc xls bmp"
set "src=%~1"
set "dest=%~2"
set "exts=%~3"
if "%exts%"=="" (echo Use: %~nx0 c:\src\ d:\dest\ "doc xls bmp" &pause &exit)
rem пример параметров для ТС: "%P" "%T" "doc xls bmp"
Jonmey
Сообщения: 59
Зарегистрирован: Пн сен 27, 2010 14:01

Сообщение Jonmey »

Tol!k
Снова вы меня выручаете. Огромное спасибо.
Однако есть небольшая проблема при работе - архивы упаковываются по расширениям файлов (сколько имеется типов файлов - столько и архивов). А хотелось бы чтобы файлы выбранных расширений из каждой папки упаковывались в один архив, то есть в бэкапе получалась каждая папка с одним архивом, причем имя архива могло бы быть одноименным с именем папки в которой он расположен.
И второе - нельзя произвольно выбрать папки для бэкапа (бекапятся все имеющиеся в папке).
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

Код: Выделить всё

@echo off &chcp 1251 >nul
setlocal enableextensions

set "src=%~1"
set "dest=%~2"
set "exts=%~3"
if "%exts%"=="" (
echo Use: %~nx0 folders4backup.list d:\destination\ "*.ext *.ext2"
pause &exit )
rem Пример параметров для ТС: %L "%T" "*.doc *.xls"

for /f "delims=" %%d in (%src%) do call :d "%%d."
goto :eof

:d
cd /d %1
rhash.exe -r -M --ansi *.* >"%~n1.md5"
zip.exe -R -S -q "%~n1.zip" %exts%
if not exist "%dest%%~n1" md "%dest%%~n1"
move "%~n1.zip" "%dest%%~n1"
goto :eof

rem rhash: http://sourceforge.net/projects/rhash/files/
rem zip: ftp://ftp.info-zip.org/pub/infozip/win32/
Jonmey
Сообщения: 59
Зарегистрирован: Пн сен 27, 2010 14:01

Сообщение Jonmey »

Tol!k
Вы волшебник! Все чудесно и как надо работает.
Единственное, чего мне непонятно - для чего точка в конце %%D: "%%d."?

P.S. Я его с WinRar использую

Код: Выделить всё

WinRAR.exe a "-cpBackup" "%~n1.rar" "*.*"
где ключ -cp задает название профиля архивирования WinRar, в котором указаны исключаемые из архивирования типы файлов и проч. параметры сжатия. Поэтому нет необходимости в третьем параметре для кнопки TC.
Аватара пользователя
Tol!k
Сообщения: 1727
Зарегистрирован: Вт апр 01, 2008 20:02
Откуда: Арзамас

Сообщение Tol!k »

Jonmey писал(а):для чего точка в конце %%D: "%%d."?
http://www.dostips.com/forum/viewtopic.php?p=4683#p4683
Jonmey
Сообщения: 59
Зарегистрирован: Пн сен 27, 2010 14:01

Сообщение Jonmey »

Обнаружилась маленькая проблема при работе скрипта, если имя папки содержит точку, то имена файлов контрольных сумм, архивов и создаваемых папок не содержат той части имени, которая идет после точки в названии папки верхнего уровня. :(
Не знаю, насколько это правильно, но для решения этой проблемы я заменил все %~n1 на %~nx1

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

Код: Выделить всё

rem Пример параметров для ТС: %L "%T"
@echo off & chcp 1251 >NUL
setlocal enableextensions

set "src=%~1"
set "dest=%~2"
for /f "delims=" %%d in (%src%) do call :d "%%d."
goto :eof

:d
cd /d %1
rhash.exe -r -M --ansi *.* >"%~nx1.md5"
if exist "%~nx1.rar" winrar.exe a "-cpBackup" "%~nx1.bak.rar" "*.*"
if not exist "%~nx1.rar" winrar.exe a "-cpBackup" "%~nx1.rar" "*.*" 
if not exist "%dest%%~nx1" md "%dest%%~nx1" 
if exist "%~nx1.bak.rar" (
  if exist "%~nx1.rar" (
    move "%~nx1.bak.rar" "%dest%%~nx1"
    goto :eof
)
)
move "%~nx1.rar" "%dest%%~nx1"
goto :eof
Ответить