部屋を掃除したら漫画が沢山出てきたので書く日記

漫画とか合唱とかUNIXとかLinuxとかについて書く日記です。

tarを利用して特定のディレクトリを移動する

/export/home/bata64/Solaris

というディレクトリを、

/var/tmp/Solaris

としてコピーしたいとします。

このとき、

$ cp -rp /export/home/bata64/Solaris /var/tmp/Solaris

とか実行すると、ディレクトリ以下にシンボリックリンクが存在する場合実ファイルとしてコピーされてしまいます(参考:)。
なので、大量にデータが格納されているディレクトリ、例えば何からのソフトウェアがインストールされているディレクトリ等の場合、cpだとどうなっているのかわからないので危険です(古くからのSolaris使う人からは伝承のように「大事なディレクトリのデータコピーのときはcp使うな」と教わったものです)。
mvだと良さそうですが、コピー元がなくなってしまうので、なんらかのトラブルで処理中断した場合、移動したデータと移動しなかったデータに分かれてしまい復旧が大変になります。どうすればいいのか?


いまどきのLinuxとかだと色々対処方法がありますが、昔はtarを使うしかなかったようです。
すなわち、こうしていました。

$ cd /export/home/bata64/
$ tar cpf - Solaris |(cd /var/tmp/;tar xpfB -)

アーカイブデータを標準出力に渡し、パイプで受けて所定ディレクトリに移動してそれを展開する、というものです。
tarはその名が示すとおりテープにアーカイブするために作られたコマンドですが、アーカイブ時にパーミッションディレクトリ以下のファイル構造を維持できるという特徴を活かし、いつしかアーカイブファイル作成用コマンドとして使われ、様々な技法が編み出されたようです。

これは便利なコマンドがインストールされていない、ネットもつながらないのでyum install出来ない、というような環境下でなんとかする時に非常に便利です。tarとbashの標準出力、標準入力のパイプ渡しはUNIXエンジニアの伝統技術みたいなものだと思いますので、これは覚えておきたいところです。

ではー。