dittoは、-kを付けずに-c・-xを指定するとCPIO形式のアーカイブを作成・展開する。-zでgzip圧縮、-jでbzip2圧縮のCPIOアーカイブも作成できる。

参考: 【ditto】コマンドでzipファイルを作成する

-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