
Я использую 7-zip для резервного копирования папок на моем диске в архивы 7z на сетевом хранилище. Каждый раз, когда запускается скрипт резервного копирования, он обновляет существующие архивы в режиме обновления 7-zip (сжимает новые файлы с диска и копирует неизмененные файлы из старого архива). Это работает нормально, но включает в себя две полные передачи каждого архива по сети.
Теперь, часто содержимое папки вообще не изменилось с момента последнего задания резервного копирования, поэтому было бы гораздо эффективнее просто пропустить всю операцию и оставить старый архив как есть. Как мне этого добиться?
решение1
Добавление параметра "-stl" устанавливает дату/время архива на дату/время последнего измененного файла. Я сделал тестовый архив только для чтения и не получил никаких ошибок от 7zip, когда я "обновил", когда файлы не были изменены. Предостережение: если также используется параметр "-mhe=on", тосодержаниеархиваявляетсяизменено, но только когда обновление не происходит в ту же минуту, что и предыдущее обновление. Другими словами, "-mhe=on" всегда перешифровывает и пересохраняет заголовки и, по-видимому, использует для этого текущее время в минутах.
решение2
Согласноруководство, вы должны иметь возможность указать комбинациюсостояниеидействиес-упереключитесь, чтобы точно контролировать, в каких случаях следует обновлять архив:
В качестве примера показано, 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