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回目以降
- アーカイブ内に無いファイルは、新しく追加される
- ソース側のファイルのタイムスタンプが新しい場合は、アーカイブ内へ上書き更新される
- アーカイブ内にあり、ソース側に無いファイルは、アーカイブ内から削除される
- アーカイブ内とソース側の両方にあり、ソース側の方がタイムスタンプが古い場合は更新されない(上書きされずスキップ)