
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:
Wie ein Beispiel zeigt, 7z u c:\1\exist.7z -up0q3x2z0!c:\1\update.7z * -ms=off
erstellt 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