7-zip 更新:若无任何变化则跳过操作

7-zip 更新:若无任何变化则跳过操作

我正在使用 7-zip 将磁盘上的文件夹备份到网络存储上的 7z 档案中。每次运行备份脚本时,它都会以 7-zip 更新模式更新现有档案(从磁盘压缩新文件并从旧档案中复制未更改的文件)。它运行良好,但需要通过网络对每个档案进行两次完整的传输。

现在,文件夹内容自上次备份作业以来通常没有任何变化,因此跳过整个操作并保留旧存档会更有效率。我该如何实现这一点?

答案1

添加“-stl”选项可将存档日期/时间设置为上次修改文件的日期/时间。我制作了一个只读的测试存档,当我“更新”没有文件更改时,7zip 没有出现错误。警告:当也使用“-mhe=on”选项时,内容档案馆更改,但仅当更新与上次更新不在同一分钟时才更改。换句话说,“-mhe=on”始终会重新加密并重新存储标头,并且显然会为此使用当前时间(以分钟为单位)。

答案2

根据手动的,你应该能够指定状态行动-u切换到精确控制在什么情况下更新档案:

1

作为示例演示,7z u c:\1\exist.7z -up0q3x2z0!c:\1\update.7z * -ms=off创建一个新的档案更新.7z并将当前目录中与目录中的文件不同的所有文件写入此档案存在.7z档案。如果省略后面跟新档案名称的 !,则只有满足指定条件时才会更新基础档案或现有档案。

答案3

我扩展了 Karan 的回答,同时保留了备份档案的上次修改时间

Windows 批处理非常有限,我只能通过使用近红外命令- Windows 命令行工具

这是一个使用批处理脚本7-zip近红外命令创建备份档案或仅在源目录发生更改时更新它们,同时保留档案修改的时间,以防止其他程序检测到档案已更改,从而防止不必要的上传。

@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

相关内容