-u switch (7-Zip)

以下の内容は、例や補足を加えているが、基本的に上の公式説明を読めばわかるしその方が正確。

概要

7-zipでは、アーカイブに何か変更を加えるコマンドには、'a'(Add), 'u'(Update), 'd'(Delete), 'rn(Rename)' がある。

「圧縮元」を圧縮して「圧縮先.7z」を作成する例

> 7z.exe a 圧縮先.7z 圧縮元

この時、「圧縮先.7z」が既にあった場合の挙動を設定するのが、'-u' スイッチである。(コマンドの'u'とは別)

また他の使い方として、ファイル単位の差分バックアップが出来る。 つまり、「既存.7z」「圧縮元」があった際に、「新規圧縮先.7z」に「圧縮元の内、既存.7zに含まれないもののみ」を圧縮する、などもできる。

2つのファイルを対象とした使い方をA、3つのファイル(差分)を対象とした使い方をBとする。

使い方

使い方A
> 7z.exe a -up1q1r2x1y1z1w1 圧縮先.7z 圧縮元

使い方B
> 7z.exe a 既存.7z -u- -up0q0r2x0y2z0w2!新規圧縮先.7z 圧縮元

'-u' に続けて、'-' だけを書くか、'pqrxyzw'の「State」と'0123'の「Action」を繋げて指定する。

使い方Bの場合は、更にその後に'!'を挟んで新規圧縮先のファイルパスを指定する。

'-u-'を指定した場合、base archive(Aでは「圧縮先.7z」、Bでは「既存.7z」)には、何があろうと全く変更は加えられない。 従って、使い方Aでこれを指定したら実質何もされない。

  • base archive はコマンドに続けて指定されるファイル。詳細は→参照 Command Line Syntax

そうでない場合は、アーカイブ(base archive)と、ディスク(圧縮元で指定されたファイル)に、同名のファイルがあるかないかをファイル毎に判定する。

Stateで両者がどのような関係の時に適用するか、Actionでその場合の挙動を指定する。

State ディスク上 既存アーカイブ上 備考
p 無関係 マッチしないファイル名 ワイルドカードで指定した時のみ
q ない ある
r ある ない
x ある(古い) ある(新しい)
y ある(新しい) ある(古い)
z ある ある 更新日時もファイルサイズも同じ
w ある ある 更新日時は同じだがサイズが異なる
Action 挙動 備考
0 既存から削除
1 既存からコピー 'r'では指定できない
2 ディスクから圧縮、上書き 'q'では指定できない
3 Anti-itemを生成(.7zのみサポート)
(アーカイブとして含まれてはいるが
 展開はしないフラグを立てる)

デフォルトの挙動

コマンド pqrxyzw
d (Delete)1000000
a (Add) 1122222
u (Update)1121212

Stateを一部だけ指定すると、残りはデフォルトの挙動となる。

使い方Bの補足

基本は、State,Actionに続けて'!'を挟んでファイルパス(新規圧縮先.7z)を書く。

  • 新規圧縮先が既存の時、エラーとなる
  • '!' を指定しなければ、その指定はbase archiveに対するものと解釈される(使い方Aに相当)
  • '-u' は何回でも指定可能であり、別々の更新設定で複数ファイルへの圧縮を一度に行える
> 7z.exe a 既存.7z -u- -up1q1!新規圧縮先1.7z -ux1y1!新規圧縮先2.7z 圧縮元
  • ファイル名の一致を比較されるのはあくまでbase archiveであり、新規圧縮先では無い
  • '-u-' を付けておかないと、既存.7zもデフォルト設定で変更されてしまう。
■実行前の中身
既存.7z:  item1.txt

> 7z.exe a 既存.7z -uz0!新規.7z item1.txt item2.txt

■実行後の中身
既存.7z:  item1.txt, item2.txt  (-u-が無いので、通常の挙動通りitem2もアーカイブに加えられる)
新規.7z:  item2.txt             (item1は既存.7zに存在するため、'z0'によりアーカイブされない)
------------------------------
■実行前の中身は同じ

> 7z.exe a 既存.7z -u- -uz0!新規.7z item1.txt item2.txt
                   ~~~
■実行後の中身
既存.7z:  item1.txt             (-u-があるので、変更は加えられない)
新規.7z:  item2.txt

コマンド例

存在しないファイルのみ圧縮して追加(同名ファイルは新しかろうが古かろうがそのまま)

> 7z.exe a -ux1y1z1w1 圧縮先.7z 圧縮元

ディスク上に無いファイルはアーカイブから削除。 (既存ファイルにActionに'0'(削除)を伴う変更を加える場合は、solid modeをoffにした方が、時間がかからないらしい)

> 7z.exe u -up0q0r0 圧縮先.7z 圧縮元 -ms=off

既存.7zに存在しない、または新しいファイルのみの新規.7zを作成(増分バックアップ)

> 7z.exe a 既存.7z -u- -up0q0r2x0y2z0w2!新規.7z 圧縮元

できないこと

「圧縮先.7zが既にあったら(中身に関わらず)全く何もせず、無かったときのみ作成」ということを行いたい場合があるのだが、意外と7-Zipではできない。 (圧縮先.7zの中身に存在しないファイルが圧縮元に指定されていたときに、それを反映させない手段が無い。 'r0'の指定では、今度は圧縮先.7zが無かった場合にも作成されなくなってしまう)

バッチや他のプログラムを噛ませ、そちらで処理前に存在を確認するしか無い。

software/7zip/update_switch.txt · 最終更新: 2020/01/31 by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0