衝撃の事実!!!tar
はPOSIXコマンドじゃなかった!!!
pax
がtarアーカイブを扱えるPOSIXコマンドのようなので、こちらを使ってみます。
日本語情報としてはAIXマニュアルのpaxコマンドの項が良いのではないかと思います。
例
ここで挙げる例は、以下のようなファイルとディレクトリのツリーを前提とします。
$ tree
.
├── dst
└── src
├── aaa
├── bbb
├── ccc
├── data
│ └── hoge
└── tmp
└── fuga
4 directories, 5 files
アーカイブの作成
$ cd src
$ pax -w * > ../archive
アーカイブの展開
$ pax -r < ../archive
アーカイブ作成時、ディレクトリの中身だけ除外する
data
ディレクトリとtmp
ディレクトリの「中身を」除外してアーカイブを作成する
paxはパスを正規表現で置換することで、ファイル/ディレクトリの除外/リネームを行うことができる.
..*
は正規表現で、任意の1文字以上を示す.
$ pax -w -s '/data\/..*//' -s '/tmp\/..*//' * > ../archive
アーカイブ展開時、ディレクトリを作成してその中に展開する
app
ディレクトリを作成してその中にアーカイブを展開する
$ pax -r -s '/..*/app\/&/' < ../archive
圧縮 -> sshで転送 -> 展開 を同時にやる
- debianだとcompress/uncompressコマンドは最初から入っていないようなので、
apt-get install ncompress
で入れます - macOSにはもちろん最初から入っています(POSIX準拠なので)
簡単な例
サーバ(vhub.local
)上にあるログが格納されているディレクトリ(dht12_log
)をローカルに持ってきたいと思います。
$ (ssh vhub.local 'pax -w dht12_log | compress') | uncompress | pax -r
$ ls
dht12_log
compress/uncompressコマンドは引数なんもつけないと標準入力を圧縮して標準出力に書き出すという動作になるので、きれいなワンライナーが書けた。
少し複雑な例
- ローカルのカレントディレクトリの中身を圧縮しつつsshで送って、リモート(sakura-rg)の
armbian
ディレクトリに展開します - アーカイブを作成する際、
.git
ディレクトリは除外します
最初以下のようにやってみたら、シンボリックリンクがおかしくなった。
pax -w -s '/.git//' * |
compress -c |
ssh sakura-rg '
rm -rf armbian;
cat |
uncompress -c |
pax -r -s "/..*/armbian\/&/"
'
とりあえず次のようにしてごまかした。
pax -w -s '/.git//' * |
compress -c |
ssh sakura-rg '
rm -rf armbian;
mkdir armbian;
cd armbian;
cat |
uncompress -c |
pax -r
'