Обновление 7-zip: пропустите операцию, если ничего не изменилось

Обновление 7-zip: пропустите операцию, если ничего не изменилось

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

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

решение1

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

решение2

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

1

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

решение3

Я расширил ответ Карана, сохранив при этом резервную копию архива на момент последнего изменения.

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

Итак, это пакетный скрипт, который использует7-молнияи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

Связанный контент