7-zip アップデート: 何も変更されていない場合は操作をスキップします

7-zip アップデート: 何も変更されていない場合は操作をスキップします

私は 7-zip を使用して、ディスク上のフォルダをネットワーク ストレージ上の 7z アーカイブにバックアップしています。バックアップ スクリプトが実行されるたびに、既存のアーカイブが 7-zip 更新モードで更新されます (ディスクから新しいファイルを圧縮し、古いアーカイブから変更されていないファイルをコピーします)。正常に動作しますが、ネットワーク経由で各アーカイブを 2 回完全に転送する必要があります。

多くの場合、フォルダーの内容は最後のバックアップ ジョブ以降まったく変更されていないため、操作全体をスキップして古いアーカイブをそのまま残す方がはるかに効率的です。どうすればこれを実現できますか?

答え1

「-stl」オプションを追加すると、アーカイブの日付/時刻が最後に変更されたファイルの日付/時刻に設定されます。テストアーカイブを読み取り専用にしましたが、ファイルが変更されていないときに「更新」しても7zipからエラーは発生しませんでした。注意: 「-mhe=on」オプションも使用すると、コンテンツアーカイブの変更されますが、更新が前回の更新と同じ分に行われない場合のみです。言い換えると、「-mhe=on」は常にヘッダーを再暗号化して再保存し、そのために現在の時刻を分単位で使用するようです。

答え2

によるマニュアルの組み合わせを指定できるはずですそしてアクションとともに-うアーカイブを更新するケースを正確に制御するには、次のスイッチを使用します。

1

例として、7z u c:\1\exist.7z -up0q3x2z0!c:\1\update.7z * -ms=off新しいアーカイブを作成しますアップデート.7zそして、現在のディレクトリにあるファイルと異なるすべてのファイルをこのアーカイブに書き込みます。存在する.7zアーカイブ。! に続いて新しいアーカイブ名を省略すると、指定された条件が満たされた場合にベース アーカイブまたは既存のアーカイブのみが更新されます。

答え3

私はバックアップアーカイブの最終更新時刻を保存しながら、Karanの回答を拡張しました

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

関連情報