View previous topic :: View next topic |
Author |
Message |
Jonmey
Joined: 27 Sep 2010 Posts: 45
|
(Separately) Posted: Sun Dec 19, 2010 01:55 Post subject: Скрипт кнопки для частичного бэкапа и архивирования |
|
|
Есть следующая задача.
Имеется много папок одного уровня (назовем его верхним). Имена всеъ папок состоят из латиницы или цифр.
В каждой их этих папок имеется набок файлов с разными расширениями, а в некоторых имеются и подпапки с файлами.
Требуется скрипт, который делает с выделенными папками следующее
1. Создает файл контрольных сумм (напр. MD5) всех файлов и подпапок каждой из папок (отдельный для содержимого каждой из папок верхнего уровня), располагая его внутри каждой из папок верхнего уровня.
2. Архивирует согласно списку расширений файлы из каждой папки верхнего уровня (вклячая подпапки) в отдельный архив. То есть нужно архивировать не все содержимое папок верхнего уровня, а только файлы с указанными в списке расширениями.
3. Перемещает эти архивы в одноименноые с папками верхнего уровня папки, которые воссоздаются в противоложной панели ТС.
В результате работы скрипта на противоположной панели ТС должен появиться список папок идентичный выделенному в другой панели, а в каждой их этих папок будет находиться по одному архиву с файлами.
И все это соотвественно нужно повесить на одну кнопку.
Если найдутся желающие помочь, я был бы очень рад. |
|
Back to top |
|
 |
Вахмурка

Joined: 27 Dec 2004 Posts: 2586 Location: Большая деревня Москва
|
(Separately) Posted: Sun Dec 19, 2010 12:50 Post subject: |
|
|
1. Пошукай в сети разные программы для резервного копирования - их там пруд пруди. Некоторые - очень мощные, снабженные различными опциями архивирования, переименования, управления уровнями вложенности, контрольными суммами, и т.д. Я их тоже когда-то перепробовал много, пока не нашел (см. п. 2);
2. Xxcopy - универсальная программа для управления файлами и директориями вообще и для их резервного копирования в частности. Описать любимую программу я позволил себе здесь. Xxcopy - конструктор: что захочешь, то и сделаешь. Правда, она не умеет считать контрольные суммы и архивировать, но это легко реализуется сторонними утилитами. Не секрет, что специализированная програма-архиватор делает это быстрее, качественнее и универсальнее, чем комбайн из п. 1.
3. PowerPro, хотя она создана несколько для другого, но настолько мощна, что справится и с поставленной задачей.
4. Если подобные задачи перед тобой встают частенько, есть смысл изучить что-нибудь: ту же XXcopy, PowerPro, vbs или хотя бы батники. Тогда при мало-мальском изменении целей (скажем,понадобится ограниичить копируемые файлы по дате создания), не придется приставать к спецам, а сделать все самому.
5. Если ни один из вариантов не подходит, жди наших добрых писателей - Batya и Tol!k'а. Хотя батники, которые мастерски пишет последний, сами не умеют архивировать, а вызывают внешние архиваторы.
Желаю удачи. _________________ Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон) |
|
Back to top |
|
 |
Flasher

Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Sun Dec 19, 2010 17:08 Post subject: |
|
|
Тут алгоритм неточный. Должно быть как-то так:
1) Создание одноимённых выделенным папок в другой панели.
2) Подсчёт сумм файлов из каждой выделенной папки.
3) Упаковка файлов, содержащихся в каждой из выделенной папки, с указанием пути одноимённой папки из другой панели.
4) Перемещение каждого md5-файла в соответствующие папки другой панели. |
|
Back to top |
|
 |
Jonmey
Joined: 27 Sep 2010 Posts: 45
|
(Separately) Posted: Sun Dec 19, 2010 21:36 Post subject: |
|
|
Вахмурка
Спасибо за советы, но пока мои способности не позволяют написать самаостоятельно единый скрипт для этой задачи. А разбивать ее на несколько скриптов нет смысла - манипулятивно-временные затраты почти те же. Дело в том, что это не разовая операция, а регулярная, и время ее проведения, частота и количество папок произвольно. То есть это может быть и одна папка и несколько. Но всего папок много (пару тысяч).
Flasher
Я написал схему так, как я это делаю вручную. Как это будет делать скрипт - без разницы. Главное, что бэкапятся (архивируются) только те файлы, которые есть в списке допустимых типов файлов, а контролиные суммы считаются для всех файлов в каждой исходной папке, но при этом контрольная сумма считается, так как она считается находясь внутри папки верхнего уровня штатной коммандой TC (для сохранения относительных путей). |
|
Back to top |
|
 |
Tol!k

Joined: 01 Apr 2008 Posts: 1727 Location: Арзамас
|
(Separately) Posted: Mon Dec 20, 2010 00:43 Post subject: |
|
|
Code: | @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/
|
Для более тесного использования с ТС
Code: | 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"
|
|
|
Back to top |
|
 |
Jonmey
Joined: 27 Sep 2010 Posts: 45
|
(Separately) Posted: Mon Dec 20, 2010 14:17 Post subject: |
|
|
Tol!k
Снова вы меня выручаете. Огромное спасибо.
Однако есть небольшая проблема при работе - архивы упаковываются по расширениям файлов (сколько имеется типов файлов - столько и архивов). А хотелось бы чтобы файлы выбранных расширений из каждой папки упаковывались в один архив, то есть в бэкапе получалась каждая папка с одним архивом, причем имя архива могло бы быть одноименным с именем папки в которой он расположен.
И второе - нельзя произвольно выбрать папки для бэкапа (бекапятся все имеющиеся в папке). |
|
Back to top |
|
 |
Tol!k

Joined: 01 Apr 2008 Posts: 1727 Location: Арзамас
|
(Separately) Posted: Mon Dec 20, 2010 21:49 Post subject: |
|
|
Code: | @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/
|
|
|
Back to top |
|
 |
Jonmey
Joined: 27 Sep 2010 Posts: 45
|
(Separately) Posted: Tue Dec 21, 2010 03:53 Post subject: |
|
|
Tol!k
Вы волшебник! Все чудесно и как надо работает.
Единственное, чего мне непонятно - для чего точка в конце %%D: "%%d."?
P.S. Я его с WinRar использую
Code: | WinRAR.exe a "-cpBackup" "%~n1.rar" "*.*" |
где ключ -cp задает название профиля архивирования WinRar, в котором указаны исключаемые из архивирования типы файлов и проч. параметры сжатия. Поэтому нет необходимости в третьем параметре для кнопки TC. |
|
Back to top |
|
 |
Tol!k

Joined: 01 Apr 2008 Posts: 1727 Location: Арзамас
|
|
Back to top |
|
 |
Jonmey
Joined: 27 Sep 2010 Posts: 45
|
(Separately) Posted: Thu Dec 23, 2010 13:40 Post subject: |
|
|
Обнаружилась маленькая проблема при работе скрипта, если имя папки содержит точку, то имена файлов контрольных сумм, архивов и создаваемых папок не содержат той части имени, которая идет после точки в названии папки верхнего уровня.
Не знаю, насколько это правильно, но для решения этой проблемы я заменил все %~n1 на %~nx1
И еще есть некоторая проблема, если папка верхнего уровня содержит архив одноименный тому, в который упаковывается бэкап (то есть одноименный с папкой верхнего уровня). Каким-то корявым образом решил это так:
Code: | 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 |
|
|
Back to top |
|
 |
|