人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Linuxでext3フォーマットの/mnt/disk1から、XFSフォーマットの/mnt/disk2に「ハードリンクの構造を保ったまま」すべてのディレクトリとファイルをコピーしたいのですが、どうすればいいでしょうか?
/dev/disk1には大量のファイルがあり、1つのファイル実体に対するハードリンクが複数あるため、duコマンドの結果は/dev/disk1の総容量を遙かに超えています。


●質問者: colk
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● JULY
●34ポイント ベストアンサー

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


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

2 ● mjy
●33ポイント

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


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

3 ● gizmo5
●33ポイント

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

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

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

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

gizmo5さんのコメント
-C オプションでも、同じっス。 GNU じゃない tar を使うことも結構あるんで、ああいう書き方をしてしまいました。 tar がハードリンクも復元することは初めて知ったので、勉強になりました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ