7-Zipでバックアップ元フォルダとアーカイブの中身を同期したい - しょぼんメモリ (´・ω・`)

7-Zipでバックアップ元フォルダとアーカイブの中身を同期したい

Windows環境において、毎日、特定フォルダを7z形式でバックアップしたかったが、毎回フルバックアップのようにアーカイブを作成するのではなく、差分だけ処理させたかった。

オプションを調べたところ、以下の2つで解決した。
https://7-zip.opensource.jp/chm/cmdline/switches/update.htm
https://superuser.com/questions/528232/synchronizing-files-using-7-zip-and-the-cli

以下の部分。

My example of "u -uq0" is identical to "u -up1q0r2x1y2z1w2", because only the "q0" is different from what "u" usually does.

公式ヘルプによると、u と -uq0 を併用すると、「Synchronize」のオプションを指定した事になるとの説明。
(一覧表の u (Update) / Synchronize の行を参照)


考え方としては、

  • 7-zip で u(update)コマンドを使用し、-uq0 のオプションを付加
  • ソリッド圧縮すると処理が遅くなるため、-ms=off としておく

をベースに、他に必要なオプションを付加して、次のようなコマンドで同期が実現できる。

7z.exe u $CompressionLevel $LogLevel $ExcludeLists -ms=off dst_file.7z -uq0 $SrcFolder

ここで、各変数は以下の通り。
$SrcFolder:ソースフォルダ
$CompressionLevel:-mx1 (fastest) ... -mx9 (ultra) の圧縮レベルを指定。
$ExcludeLists:除外ディレクトリを指定(例:-xr!"Thumbs.db" -xr!"*.tmp")
$LogLevel:-bb0~-bb3,(少~多)を指定。未指定の場合は、-bb0:なし、になる。
https://7-zip.opensource.jp/chm/cmdline/switches/method.htm
https://7-zip.opensource.jp/chm/cmdline/switches/exclude.htm
https://7-zip.opensource.jp/chm/cmdline/switches/bb.htm


動作を試すと、次のようになる。
1回目:すべてアーカイブに追加される(除外指定したものは対象外)
2回目以降
 - アーカイブ内に無いファイルは、新しく追加される
 - ソース側のファイルのタイムスタンプが新しい場合は、アーカイブ内へ上書き更新される
 - アーカイブ内にあり、ソース側に無いファイルは、アーカイブ内から削除される
 - アーカイブ内とソース側の両方にあり、ソース側の方がタイムスタンプが古い場合は更新されない(上書きされずスキップ)