Linuxでext3フォーマットの/mnt/disk1から、XFSフォーマットの/mnt/disk2に「ハードリンクの構造を保ったまま」すべてのディレクトリとファイルをコピーしたいのですが、どうすればいいでしょうか?

/dev/disk1には大量のファイルがあり、1つのファイル実体に対するハードリンクが複数あるため、duコマンドの結果は/dev/disk1の総容量を遙かに超えています。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/05/18 22:53:18
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:JULY No.1

回答回数966ベストアンサー獲得回数247

ポイント34pt

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 オプションについても解説されています。

id:colk

回答ありがとうございました。
GNU tarにハードリンクを保持する機能があるんですね、勉強になりました。(GNU版のみの機能?)
コピー元のdisk1は、2TBの90%程度使っているのでNo.3の回答者様が書かれたように、ファイルに落とさないで処理してみたいと思います。

2012/05/18 22:51:51

その他の回答2件)

id:JULY No.1

回答回数966ベストアンサー獲得回数247ここでベストアンサー

ポイント34pt

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 オプションについても解説されています。

id:colk

回答ありがとうございました。
GNU tarにハードリンクを保持する機能があるんですね、勉強になりました。(GNU版のみの機能?)
コピー元のdisk1は、2TBの90%程度使っているのでNo.3の回答者様が書かれたように、ファイルに落とさないで処理してみたいと思います。

2012/05/18 22:51:51
id:mjy No.2

回答回数70ベストアンサー獲得回数22

ポイント33pt

cp -a
でよいと思います。

id:colk

cpコマンドの-dオプションでハードリンクが維持されそうに思うのですが、
実際にコピーしてみたらコピー先容量不足でコピーできなかったです。
もしかして cp -al でないとだめなのかな?

2012/05/18 22:50:03
id:gizmo5 No.3

回答回数504ベストアンサー獲得回数141

ポイント33pt

一番目の人が言うように、GNU tar はハードリンクを復元してくれるみたいです。

/mnt/disk1 が /data1 に、/mnt/disk2 が /data2 にマウントされていたとして、こんな感じでコマンドを打てば、空き領域を気にせずにコピーできます。

% cd /data1
% tar cf - . | (cd /data2 ; tar xf -)
id:colk

回答ありがとうございます。
単純にパイプで繋ぐのはやりますけど、丸括弧でグループ指定(範囲指定?)する書き方は知りませんでした。どういう順序でコマンド処理されるのかピンとこないです。
シェルに慣れていないので、tarの-Cオプションでも良いですよね?

2012/05/18 22:48:41
id:gizmo5

-C オプションでも、同じっス。
GNU じゃない tar を使うことも結構あるんで、ああいう書き方をしてしまいました。

tar がハードリンクも復元することは初めて知ったので、勉強になりました。

2012/05/18 23:50:05

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません