/dev/disk1には大量のファイルがあり、1つのファイル実体に対するハードリンクが複数あるため、duコマンドの結果は/dev/disk1の総容量を遙かに超えています。
Linux であれば、tar コマンドは GNU 版だと思いますが、GNU tar はハードリンクに対応しています。
GNU tar 1.26: 8.3.3 Hard Links
Normally, when tar archives a hard link, it writes a block to the archive naming the target of the link (a ‘1’ type block). In that way, the actual file contents is stored in file only once.
単純に tar で固めたファイルを元に戻せば、ハードリンクを保ったまま、元に戻せます。これであれば、ファイルシステムの違いによる問題は起きないはずです。
ちなみに、上記ページでは、アーカイブ対象にハードリンクがある場合に、アーカイブ対象外になっている物があるかをチェックする -l オプションの例や、ハードリンクを通常のファイルとして展開する --hard-dereference オプションについても解説されています。
Linux であれば、tar コマンドは GNU 版だと思いますが、GNU tar はハードリンクに対応しています。
GNU tar 1.26: 8.3.3 Hard Links
Normally, when tar archives a hard link, it writes a block to the archive naming the target of the link (a ‘1’ type block). In that way, the actual file contents is stored in file only once.
単純に tar で固めたファイルを元に戻せば、ハードリンクを保ったまま、元に戻せます。これであれば、ファイルシステムの違いによる問題は起きないはずです。
ちなみに、上記ページでは、アーカイブ対象にハードリンクがある場合に、アーカイブ対象外になっている物があるかをチェックする -l オプションの例や、ハードリンクを通常のファイルとして展開する --hard-dereference オプションについても解説されています。
回答ありがとうございました。
GNU tarにハードリンクを保持する機能があるんですね、勉強になりました。(GNU版のみの機能?)
コピー元のdisk1は、2TBの90%程度使っているのでNo.3の回答者様が書かれたように、ファイルに落とさないで処理してみたいと思います。
cp -a
でよいと思います。
cpコマンドの-dオプションでハードリンクが維持されそうに思うのですが、
実際にコピーしてみたらコピー先容量不足でコピーできなかったです。
もしかして cp -al でないとだめなのかな?
一番目の人が言うように、GNU tar はハードリンクを復元してくれるみたいです。
/mnt/disk1 が /data1 に、/mnt/disk2 が /data2 にマウントされていたとして、こんな感じでコマンドを打てば、空き領域を気にせずにコピーできます。
% cd /data1 % tar cf - . | (cd /data2 ; tar xf -)
回答ありがとうございます。
単純にパイプで繋ぐのはやりますけど、丸括弧でグループ指定(範囲指定?)する書き方は知りませんでした。どういう順序でコマンド処理されるのかピンとこないです。
シェルに慣れていないので、tarの-Cオプションでも良いですよね?
-C オプションでも、同じっス。
GNU じゃない tar を使うことも結構あるんで、ああいう書き方をしてしまいました。
tar がハードリンクも復元することは初めて知ったので、勉強になりました。
回答ありがとうございました。
2012/05/18 22:51:51GNU tarにハードリンクを保持する機能があるんですね、勉強になりました。(GNU版のみの機能?)
コピー元のdisk1は、2TBの90%程度使っているのでNo.3の回答者様が書かれたように、ファイルに落とさないで処理してみたいと思います。