web-dev-qa-db-ja.com

ハードリンクを保持したままディレクトリをコピーする方法は?

共通のファイルを持つディレクトリをあるパーティションから別のパーティションに移動するにはどうすればよいですか?

/mnt/Xにパーティションをマウントし、ディレクトリをハードリンクで共有するディレクトリがあるとします。このようなディレクトリを別のパーティションに移動する方法は、ハードリンクを保持したまま/mnt/Yにしてください。

「ハードリンクと共通のファイルを共有するディレクトリ」の意味をわかりやすく説明するために、以下に例を示します。

# let's create three of directories and files
mkdir -p a/{b,c,d}/{x,y,z}
touch a/{b,c,d}/{x,y,z}/f{1,2,3,4,5}
# and copy it with hardlinks
cp -r -l a hardlinks_of_a

具体的には、ファイルの合計サイズが10Gで、各ファイルに10個のハードリンクがあるとします。問題は、10Gを使用してそれを宛先に移動する方法です(100Gでそれをコピーしてから重複排除を実行することについて誰かが言うかもしれません-それは私が求めているものではありません)

40

最初の回答:GNU Way

GNU cp -aは、可能な限り多くの構造とメタデータを保持しながら再帰的にコピーします。ソースディレクトリ内のファイル間のハードリンクはその中に含まれています。特に-aの他のすべての機能なしでハードリンク保持を選択するには、--preserve=linksを使用します。

mkdir src
cd src
mkdir -p a/{b,c,d}/{x,y,z}
touch a/{b,c,d}/{x,y,z}/f{1,2,3,4,5}
cp -r -l a hardlinks_of_a
cd ..
cp -a src dst
29
Alan Curry

rsyncには-Hまたは--hard-linksこれにはオプションがあり、停止して再起動できるという通常のrsyncの利点があり、前の実行中に/後に変更されたファイルを効率的に処理するために再実行できます。

-H, --hard-links
    This tells rsync to look for hard-linked files in
    the source and link together the corresponding
    files on the destination.  Without  this option,
    hard-linked files in the source are treated as
    though they were separate files. [...]

rsyncのマニュアルページを読み、-Hを検索します。特定の警告に関する詳細がそこにあります。

38
cas

3番目の答え:POSIXの方法

POSIXはtarユーティリティを標準化していませんが、tarアーカイブ形式を標準化しています。 tarアーカイブを操作するためのPOSIXユーティリティはpaxと呼ばれ、単一のプロセスでパックおよびアンパック操作を実行できるというボーナス機能があります。

mkdir dst
pax -rw src dst
14
Alan Curry

2番目の答え:古代UNIXの方法

ソースディレクトリにtarアーカイブを作成し、それをパイプ経由で送信し、宛先ディレクトリに解凍します。

# create src as before
(cd src;tar cf - .) | (mkdir dst;cd dst;tar xf -)
10
Alan Curry

ソース: http://www.cyberciti.biz/faq/linux-unix-Apple-osx-bsd-rsync-copy-hard-links/

正確なコピーを作成するために必要なものは

rsync -az -H --delete --numeric-ids /path/to/source/ /path/to/dest/
10
Pykler