1

Я использую 7-zip для резервного копирования папок на моем диске в архивы 7z в сетевом хранилище. Каждый раз, когда запускается скрипт резервного копирования, он обновляет существующие архивы в режиме обновления 7-zip (сжимает новые файлы с диска и копирует неизмененные файлы из старого архива). Он работает нормально, но включает в себя две полные передачи каждого архива по сети.

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

3 ответа3

1

Согласно инструкции, вы должны быть в состоянии указать комбинацию состояния и действия с ключом -u, чтобы точно контролировать, в каких случаях вы хотите обновить архив:

1

Как показывает пример, 7z u c:\1\exist.7z -up0q3x2z0!c:\1\update.7z * -ms=off создает новый архив update.7z и записывает в этот архив все файлы из текущего каталога, которые отличаются от файлов в архиве exist.7z . Если вы опустите! затем новое имя архива, тогда только базовый или существующий архив должен обновляться, если соблюдены указанные условия.

0

Я расширил ответ Каран, сохранив архив резервных копий в последний раз

Пакет Windows очень ограничен, и я мог заставить этот сценарий работать только с помощью NirCmd - инструмента командной строки Windows

Так что это пакетный скрипт, который использует 7-zip и NirCmd для создания резервных архивов или обновления их только в том случае, если исходный каталог был изменен, при этом время изменения архива было сохранено, чтобы другие программы не могли обнаружить архив как измененный, что предотвращает нежелательные загрузки. ,

@ECHO OFF


SET BaseDir=c:\Users
SET BkpsDir=d:\Backup


IF NOT EXIST "7za.exe" GOTO ExitError
IF NOT EXIST "nircmd.exe" GOTO ExitError
SET TimeFile=%temp%\tmpCloneFileTimeFile.bkp
SET OutputFile=%temp%\tmpOutputFile.bkp

REM create a temporary file
copy /y NUL "%TimeFile%" 1>NUL


CALL :CompressDirIfChanged Public\Music PublicMusic.7z
CALL :CompressDirIfChanged Dragos\Favorites DragosFavorites.7z


DEL "%TimeFile%" /F /Q >nul 2>nul
DEL "%OutputFile%" /F /Q >nul 2>nul

ECHO.
ECHO SUCCESS
ECHO.
PAUSE
EXIT
goto:eof 


REM call :CompressDirIfChanged sourceDirRelativeToBaseDir ArchiveName
:CompressDirIfChanged
    SET BkpSrc="%~1"
    SET ArchDest=%BkpsDir%\%~2
    CD "%BaseDir%"
    IF EXIST "%ArchDest%" (
        nircmd.exe clonefiletime "%ArchDest%" "%TimeFile%"
        7za.exe u -up1q0r2x1y2z1w2 -mx=9 "%ArchDest%" "%BkpSrc%" 1>"%OutputFile%"
        IF errorlevel 1 GOTO ExitError
        FINDSTR /bli /c:"Items to compress: 0" "%OutputFile%" && FINDSTR /bli /c:"Files read from disk: 0" "%OutputFile%" && (
            ECHO - no changes in %BkpSrc%, restoring Last Modified Time
            nircmd.exe clonefiletime "%TimeFile%" "%ArchDest%"
        ) || (
            ECHO - updating %ArchDest%
        )
    ) ELSE (
        ECHO - creating %ArchDest%
        7za.exe a -aoa -mx=9 "%ArchDest%" "%BkpSrc%" 1>nul
        IF errorlevel 1 GOTO ExitError
    )
goto:eof

:ExitError
    ECHO ERROR!
    PAUSE
    EXIT 1
goto:eof
0

Добавление опции "-stl" устанавливает дату / время архивов в соответствии с датой последнего измененного файла. Я сделал тестовый архив только для чтения и не получил ошибку от 7zip, когда "обновлялся", когда файлы не были изменены. Оговорка: Когда «-mhe = на» опция используется слишком, то содержимое архива изменяется, но только тогда , когда обновление не происходит в ту же минуту , как в предыдущем обновлении. Другими словами, «-mhe = on» всегда повторно шифрует и повторно сохраняет заголовки и, очевидно, использует для этого текущее время в минутах.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .