dittoは、-kを付けずに-c・-xを指定するとCPIO形式のアーカイブを作成・展開する。-zでgzip圧縮、-jでbzip2圧縮のCPIOアーカイブも作成できる。
-cでCPIOアーカイブを作成する
ditto -c <コピー元> <アーカイブファイル>の形式で実行する。man dittoでは、CPIOアーカイブのファイル名を.cpioで終わらせるよう推奨している。
$ ditto -c project project.cpio
$ file project.cpio
project.cpio: ASCII cpio archive (pre-SVR4 or odc)
zipファイルと同様に、アーカイブにはディレクトリの中身だけが入る。--keepParentを付けると、コピー元のディレクトリ名もアーカイブに含める。
-z・-jで圧縮する
-zを指定するとgzip、-jを指定するとbzip2で圧縮したCPIOアーカイブを作成する。man dittoは、gzip圧縮したCPIOアーカイブのファイル名に.cpgzを推奨している。
$ ditto -c -z project project.cpgz
$ ditto -c -j project project.cpbz
$ file project.cpgz project.cpbz
project.cpgz: gzip compressed data, from Unix, original size modulo 2^32 590848
project.cpbz: bzip2 compressed data, block size = 900k
約590KBのテキストファイルを含むディレクトリで、サイズを比較した結果は以下の通り。
$ stat -f "%z %N" project.cpio project.cpgz project.cpbz
590848 project.cpio
213303 project.cpgz
124847 project.cpbz
paxでアーカイブの中身を一覧表示する
ditto自体にはアーカイブの中身を一覧表示する機能がない。man dittoでは、paxコマンドで一覧表示する方法を紹介している。
$ pax -f project.cpio
.
./nums.txt
./._nums.txt
./sub
./sub/b.txt
./sub/._b.txt
./._sub
./a.txt
./._a.txt
gzip圧縮したアーカイブは-zを付ける。
$ pax -zf project.cpgz
-vを付けると、ls -lのような形式でパーミッションやサイズも表示する。
$ pax -v -f project.cpio
drwxr-xr-x 5 user wheel 0 9月 27 09:32 .
-rw-r--r-- 1 user wheel 588895 9月 27 09:32 ./nums.txt
-rw-r--r-- 1 user wheel 163 9月 27 09:32 ./._nums.txt
drwxr-xr-x 3 user wheel 0 9月 27 09:32 ./sub
-rw-r--r-- 1 user wheel 6 9月 27 09:32 ./sub/b.txt
-rw-r--r-- 1 user wheel 163 9月 27 09:32 ./sub/._b.txt
-rw-r--r-- 3 user wheel 163 9月 27 09:32 ./._sub
-rw-r--r-- 1 user wheel 6 9月 27 09:32 ./a.txt
-rw-r--r-- 1 user wheel 163 9月 27 09:32 ./._a.txt
._で始まるファイルは、拡張属性などのメタデータを格納したAppleDouble形式のファイルである。メタデータの扱いについては【ditto】拡張属性やACLを保持してコピーする
を参照。
-xでCPIOアーカイブを展開する
ditto -x <アーカイブファイル> <展開先ディレクトリ>の形式で展開する。圧縮されたCPIOアーカイブも自動で判別して展開するため、-zや-jの指定は不要である。
$ ditto -x project.cpgz out
$ find out
out
out/nums.txt
out/sub
out/a.txt
out/sub/b.txt
._ファイルは作られず、中身のメタデータが元のファイルの拡張属性として復元される。
参考
DITTO Command: Copy directory hierarchies, create and extract archives in macOS\第一線のプログラマーの行動原理を学べる!/
