dittoに-x -kを指定すると、zipファイルを展開できる。unzipコマンドと違い、._ファイルや__MACOSX/に格納されたmacOSのメタデータを元のファイルに復元する。
-x -kでzipファイルを展開する
ditto -x -k <zipファイル> <展開先ディレクトリ>の形式で実行する。-xはアーカイブの展開、-kはPKZip(zip)形式の指定である。
$ ditto -x -k project.zip out
$ find out
out
out/project
out/project/sub
out/project/a.txt
out/project/sub/b.txt
展開先のディレクトリが存在しない場合は、途中のディレクトリも含めて自動で作成される。
$ ditto -x -k project.zip out/x/y
$ find out
out
out/x
out/x/y
out/x/y/project
out/x/y/project/sub
out/x/y/project/a.txt
out/x/y/project/sub/b.txt
-kを付け忘れると、CPIO形式のアーカイブとみなして読み込もうとし、エラーになる。
$ ditto -x project.zip out
ditto: cpio read error: bad file format
メタデータを復元する
project.zipはditto -c -k --keepParentにより作成したzipファイルである。._から始まるAppleDouble形式のファイルを含む。unzipで展開した場合、._ファイルはそのまま通常のファイルになる。
$ unzip -q project.zip -d out1
$ find out1
out1
out1/project
out1/project/._sub
out1/project/sub
out1/project/a.txt
out1/project/._a.txt
out1/project/sub/b.txt
out1/project/sub/._b.txt
ditto -x -kで展開すると、._ファイルは作られず、中身のメタデータが元のファイルの拡張属性として復元される。
$ ditto -x -k project.zip out2
$ find out2
out2
out2/project
out2/project/sub
out2/project/a.txt
out2/project/sub/b.txt
$ xattr -l out2/project/a.txt
com.apple.provenance:
com.example.note: hello
--sequesterRsrcで__MACOSX/にメタデータをまとめたzipファイルも、同様にメタデータを復元して展開する。
既存のディレクトリに展開する
展開先のディレクトリがすでに存在する場合は、既存の内容にマージされる。zipファイルに含まれないファイルはそのまま残る。
$ find out
out
out/project
out/project/keep.txt
$ ditto -x -k project.zip out
$ find out
out
out/project
out/project/sub
out/project/a.txt
out/project/keep.txt
out/project/sub/b.txt
複数のzipファイルをまとめて展開する
zipファイルを複数指定すると、すべて同じ展開先に展開する。
$ ditto -x -k project.zip one.zip out
$ find out
out
out/project
out/a.txt
out/project/sub
out/project/a.txt
out/project/sub/b.txt
--passwordでパスワード付きzipファイルを展開する
パスワード付きのzipファイルをそのまま展開しようとすると、エラーになる。
$ ditto -x -k secret.zip out
ditto: No password was provided and the client did not provide a callback for retrieving the PKZip encryption key
--passwordを指定すると、パスワードの入力を求められる。
$ ditto -x -k --password secret.zip out
Please enter the password for file s.txt:
$ cat out/s.txt
secret-data
パスワードを間違えた場合は、正しいパスワードを入力するまで同じプロンプトが繰り返し表示される。
標準入力から展開する
zipファイルのパスに-を指定すると、標準入力からzipファイルを読み込む。
$ cat project.zip | ditto -x -k - out
$ find out
out
out/project
out/project/sub
out/project/a.txt
out/project/sub/b.txt
標準入出力を使ったアーカイブの受け渡しについては【ditto】標準入出力とsshでディレクトリを転送する を参照。
