ディレクトリ階層を維持しながら、ファイルをハードリンクとしてディレクトリに再帰的にコピーするにはどうすればよいですか?

ディレクトリ階層を維持しながら、ファイルをハードリンクとしてディレクトリに再帰的にコピーするにはどうすればよいですか?

あるディレクトリ階層内のファイルを別のディレクトリにハードリンクしようとしています。コードは次のようになります。

# Directories first, works fine, takes sub-second
find src_dir/sub1 src_dir/sub2 -type d -exec bash -c 'cd "$0" && mkdir -p "$@"' dest_dir {} +
# Files next, works fine, takes several seconds
find src_dir/sub1 src_dir/sub2 -type f -exec ln -f {} dest_dir/{} \;

ハードリンクは、 を連続的に呼び出すため、非常に遅くなりますln。しかし、機能する形式が思いつかず、cpおよびrsyncman ページでハードリンクとしてのコピーについてあまり見つけることができません。特定の問題に対して C プログラムを書くことに傾いています...

その穴に飛び込む前に、UNIX または他の有名なサードパーティ ツールを使用して速度を上げる方法について何か提案はありますか?

答え1

GNUcpファイルのコピーの代わりにハードリンクをサポートします:

cp -lR src_dir dest_dir

dest_dirがすでに存在する場合、これsrc_dirは にコピーされ、内のすべてのディレクトリのコピーがdest_dir作成されます。dest_dir/src_dirsrc_dir

のサブセットのみが必要な場合はsrc_dir、サブディレクトリを明示的にコピーできます。

mkdir -p dest_dir/src_dir
cp -lR src_dir/sub1 dest_dir/src_dir/sub1
cp -lR src_dir/sub2 dest_dir/src_dir/sub2

関連情報