tarで複数のディレクトリを起点にして圧縮する方法

タイトルの通り。
どういうことかというと次のようなディレクトリ構造をもったプロジェクトがあったとする。

.
├── dest
│   └── hoge
└── src
    └── config
        └── dev.yml

このディレクトリを圧縮して解凍した時のディレクトリにはhoge, dev.ymlが同じディレクトリに展開したい。
同じ階層であれば解凍する時に--strip-componentsを指定すれば良いが今回のように片方は1階層、もう片方は2階層とかするとこれを使うことは出来ない。

これが1つのディレクトリであればtar -zcvf hoge.tar.gz -C src/config .とかすれば解凍した時にdev.ymlが出るので良いが複数ディレクトリではどうしたら良いのか。。。

答え

$ tar -zcvf hoge.tar.gz -C dest . -C ../src/config .

tarのヘルプでCオプションを見てみると中身的には指定されてディレクトリに移動しているだけ。
なので2個目を指定する時は1つ前のCオプションで移動したディレクトリの相対パスなんですね。
※ 両方とも絶対パスで指定でもいけます

$ tar --help | grep "\-\C"
Create: tar -c [options] [<file> | <dir> | @<archive> | -C <dir> ]
  -C <dir>  Change to <dir> before processing remaining files

最後に

今回はtarで複数のディレクトリを起点として圧縮する方法を紹介しました。