7-Zip-Update: Vorgang überspringen, wenn sich nichts geändert hat

7-Zip-Update: Vorgang überspringen, wenn sich nichts geändert hat

Ich verwende 7-Zip, um Ordner auf meiner Festplatte in 7z-Archiven auf einem Netzwerkspeicher zu sichern. Jedes Mal, wenn das Sicherungsskript ausgeführt wird, aktualisiert es die vorhandenen Archive im 7-Zip-Aktualisierungsmodus (komprimiert neue Dateien von der Festplatte und kopiert unveränderte Dateien aus dem alten Archiv). Das funktioniert einwandfrei, erfordert jedoch zwei vollständige Übertragungen jedes Archivs über das Netzwerk.

Häufig hat sich der Ordnerinhalt seit dem letzten Backup-Auftrag überhaupt nicht geändert. Daher wäre es viel effizienter, den gesamten Vorgang einfach zu überspringen und das alte Archiv so zu belassen, wie es ist. Wie kann ich das erreichen?

Antwort1

Durch Hinzufügen der Option „-stl“ werden Datum und Uhrzeit des Archivs auf die letzte geänderte Datei gesetzt. Ich habe ein Testarchiv schreibgeschützt gemacht und erhielt keinen Fehler von 7zip, als ich „aktualisiert“ habe, obwohl keine Dateien geändert wurden. Vorbehalt: Wenn auch die Option „-mhe=on“ verwendet wird, dannInhaltdes ArchivsIstgeändert, aber nur, wenn das Update nicht in derselben Minute wie das vorherige Update erfolgt. Mit anderen Worten: „-mhe=on“ verschlüsselt und speichert Header immer neu und verwendet dafür anscheinend die aktuelle Zeit in Minuten.

Antwort2

Entsprechend derHandbuchsollten Sie eine Kombination ausZustandUndAktionmit dem-uSchalter, um genau zu steuern, in welchen Fällen das Archiv aktualisiert werden soll:

1

Wie ein Beispiel zeigt, 7z u c:\1\exist.7z -up0q3x2z0!c:\1\update.7z * -ms=offerstellt ein neues Archivaktualisieren.7zund schreibt in dieses Archiv alle Dateien aus dem aktuellen Verzeichnis, die sich von Dateien imexistieren.7zArchiv. Wenn Sie das ! gefolgt vom neuen Archivnamen weglassen, sollte nur das Basis- oder vorhandene Archiv aktualisiert werden, wenn die angegebenen Bedingungen erfüllt sind.

Antwort3

Ich habe Karans Antwort erweitert und dabei das Backup-Archiv mit der letzten Änderungszeit beibehalten

Die Batch-Funktion von Windows ist sehr eingeschränkt und ich konnte das Skript nur mit folgendem Befehl zum Laufen bringen:NirCmd- Windows-Befehlszeilentool

Dies ist also ein Batch-Skript, das verwendet7-ReißverschlussUndNirCmdum Sicherungsarchive zu erstellen oder sie nur zu aktualisieren, wenn das Quellverzeichnis geändert wurde, während die Änderungszeit des Archivs erhalten bleibt, um zu verhindern, dass andere Programme das Archiv als geändert erkennen und so ungewollte Uploads zu verhindern.

@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

verwandte Informationen