Узагальнення по кустарному архівуванню(robocopy та 7zip).

backup logo

Узагальнення про використання 7zip та robocopy на прикладі реальних задач для бекапу з гівна і палок.

Бекап директорій(повний)

За допомогою 7zip:

:: Скрипт архівує директорію nyurch.github.io

@echo off

SET projects_path="d:\github"
SET jkl_path="d:\github\nyurch.github.io"
SET arch_path="C:\Program Files\7-Zip"
SET dd=%DATE:~0,2%
SET mm=%DATE:~3,2%
SET yyyy=%DATE:~6,4%
SET arch_date=%dd%-%mm%-%yyyy%

%arch_path%\7z.exe a -ssw -mx1 -r0 %projects_path%\nyurch-backup_%arch_date%.zip %jkl_path% -xr!.jekyll-cache -xr!.git -xr!_site

pause

Архівується все за вийнятком директорій .jekyll_cache , .git , _site . Начорта воно здалося якщо все включаючи історію змін є на github? Сила звички, а буває щось як наміняєш то простіше розвернути з архіву ніж шукати де баг, особливо якщо не зразу проявилося.

Те саме але за допомогою robocopy:

:: Скрипт дублює директорію nyurch.github.io

@echo off

SET projects_path="d:\github"
SET jkl_path="d:\github\nyurch.github.io"
SET dd=%DATE:~0,2%
SET mm=%DATE:~3,2%
SET yyyy=%DATE:~6,4%
set h=%TIME:~0,2%
set m=%TIME:~3,2%
SET arch_date=%dd%-%mm%-%yyyy%
SET arch_time=%h%-%m%

robocopy %jkl_path% %projects_path%\nyurch.github.io-%arch_date%\ *.* /E /XD .jekyll-cache .git _site /LOG+:%projects_path%\robocopy.log

pause

Якщо замість ключа /E використати ключ /MIR відбудеться синхронізація директорій. Файли що були видалені з вихідної директорії видаляться з директорії архіву.

Бекап директорій(інкрементальний)

Можна робити архів змін, а не всієї директорії. На прикладі того ж проекту:

:: Скрипт архівує зміни в директорії nyurch.github.io з моменту останнього повного архівування

@echo off

SET projects_path="d:\github"
SET jkl_path="d:\github\nyurch.github.io"
SET arch_path="C:\Program Files\7-Zip"
SET dd=%DATE:~0,2%
SET mm=%DATE:~3,2%
SET yyyy=%DATE:~6,4%
set h=%TIME:~0,2%
set m=%TIME:~3,2%
SET arch_date=%dd%-%mm%-%yyyy%
SET arch_time=%h%-%m%

%arch_path%\7z.exe u %projects_path%\nyurch-backup_%arch_date%.zip -u- -up0q3r2x2y2z0w2^!%projects_path%\nyurch-backup_%arch_date%_%arch_time%.zip %jkl_path% -xr!.jekyll-cache -xr!.git -xr!_site

pause

Буде створено архів змін сьогоднішнього дня. Наприклад зранку перед початком роботи робиться повний архів, ввечері після завершення роботи робиться архів змін за день.

За допомогою robocopy:

:: Скрипт архівує зміни директорії nyurch.github.io

@echo off

SET projects_path="d:\github"
SET jkl_path="d:\github\nyurch.github.io"
SET dd=%DATE:~0,2%
SET mm=%DATE:~3,2%
SET yyyy=%DATE:~6,4%
set h=%TIME:~0,2%
set m=%TIME:~3,2%
SET arch_date=%dd%-%mm%-%yyyy%
SET arch_time=%h%-%m%

robocopy %jkl_path% %projects_path%\nyurch.github.io-%arch_date%_1-day\ *.*  /maxage:1 /S /XD .jekyll-cache .git _site /LOG+:%projects_path%\robocopy.log

pause

Скрипт створить директорію зі змінами внесеними протягом дня від поточної дати( ключ /maxage:1)

Стрьомна магія

robocopy ще має цікаву функцію відслідковування змін на льоту. Наприклад:

:: Скрипт відслідковує зміни директорії nyurch.github.io на льоту

@echo off

SET projects_path="d:\github"
SET jkl_path="d:\github\nyurch.github.io"

robocopy %jkl_path% %projects_path%\nyurch.github.io-clone\ /MIR /LOG+:%projects_path%\robocopy.log /mon:1 /mot:1

Скрипт моніторить джерело кожні X хвилин, ключ /mot:X та синхронізує директорії якщо було внесено Y змін, ключ /mon:Y.