-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のみサポート) (アーカイブとして含まれてはいるが 展開はしないフラグを立てる) |
デフォルトの挙動
コマンド | p | q | r | x | y | z | w |
---|---|---|---|---|---|---|---|
d (Delete) | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
a (Add) | 1 | 1 | 2 | 2 | 2 | 2 | 2 |
u (Update) | 1 | 1 | 2 | 1 | 2 | 1 | 2 |
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が無かった場合にも作成されなくなってしまう)
バッチや他のプログラムを噛ませ、そちらで処理前に存在を確認するしか無い。