
巨大なファイル(合計約1TB)のディレクトリがあり、それらをコピーしたくありません。しかし、それらを回避したいので、アクセスできるディレクトリ階層(つまり、私が作成したもの)にリンクしておくと便利です。
/path/to/dirs/
foo
bar
baz/
tri
コピー先
~/path/to/dirs/
foo -> /path/to/dirs/foo
bar -> /path/to/dirs/bar
baz/
tri -> /path/to/dirs/tri
答え1
GNUの場合:
cd ~/path/to/dirs || exit 1
find /path/to/dirs -type d -printf %P\\0 | xargs -0 mkdir -p
find /path/to/dirs -type f -print0 |
xargs -0 cp --symbolic-link --parents --target-directory=.
答え2
GNU coreutils を使用する場合 (つまり、非組み込み Linux または Cygwin の場合):
cp -al /path/to/dirs ~/path/to/dirs
cp
オプションがない場合は-l
、最初のパスでディレクトリ階層を作成し、次に 2 番目のパスでシンボリック リンクを作成します。
find /path/to/dirs -type d -exec sh -c 'for x do mkdir "$HOME$x"; done' _ {} +
find /path/to/dirs ! -type d -exec sh -c 'for x do ln -s "$x" "$HOME$x"; done' _ {} +
必要に応じて、2 つのパスを 1 つのコマンドに組み合わせることもできます。
find /path/to/dirs -exec sh -c '
for x do
if [ -d "$x" ]; then
mkdir "$HOME$x"
else
ln -s "$x" "$HOME$x"
fi
done
' _ {} +
答え3
cp --no-dereference orig dest
これにより、コピー時にシンボリックリンクが保持されます。ドキュメントは次のとおりです。
-P, --no-dereference never follow symbolic links in SOURCE
-p same as --preserve=mode,ownership,timestamps