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

我擴展了卡蘭的答案,同時保留了備份存檔的上次修改時間

Windows批次非常有限,我只能透過使用使這個腳本工作尼爾命令- Windows 命令列工具

這是一個批次腳本,使用7-拉鍊尼爾命令建立備份檔案或僅在來源目錄變更時更新它們,同時保留存檔修改時間,以防止其他程式偵測到存檔已更改,從而防止不必要的上傳。

@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

相關內容