tarコマンドのかわりにpaxコマンドを使う


衝撃の事実!!!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
'