パス上のシンボリックリンクを使用した rsync

パス上のシンボリックリンクを使用した rsync

ディレクトリに次のようなパスがあるとします:

a/b/c/d/e

c実際にはシンボリックリンクである

a/b/c -> f

そしてfが含まれていますd/e

rsync -avzR次に、フラグなしでを実行すると--copy-unsafe-links、この「安全でない」リンクがコピーされます。

期待される:

a/b/c->f
f/d/e

走るときrsync -avzR a/b/c/d/e some_dir

実際の出力:

a/b/c/d/e

この方法で期待どおりの出力を得るにはどうすればよいですか?

答え1

パーman rsync(強調は筆者):

-R, --相対

相対パスを使用します。これは、ファイル名の最後の部分だけではなく、コマンドラインで指定されたフルパス名がサーバーに送信されることを意味します。

rsync -avR /foo/bar/baz.c remote:/tmp/

すると、/tmp/foo/bar/baz.c というファイルがリモートマシン上に作成され、そのフルパスが保持されます。これらの追加のパス要素は「暗黙のディレクトリ」(つまり、上記の例では「foo」ディレクトリと「foo/bar」ディレクトリ)。

rsync 3.0.0以降では、rsync は、パス要素が送信側で実際にはシンボリックリンクである場合でも、これらの暗黙のディレクトリをファイル リスト内の実際のディレクトリとして常に送信します。 これにより、パスにシンボリックリンクがあることに気付かなかったファイルのフルパスをコピーするときに、予期しない動作が発生するのを防ぐことができます。サーバー側のシンボリックリンクを複製する場合は、パスを介してシンボリックリンクと、実際のパスを介して参照先ディレクトリの両方を含めます。送信側で古い rsync を使用している場合は、オプションを使用する必要がある場合があります--no-implied-dirs

したがって、あなたが経験した動作は予想されたものです。

これを克服するにはどうすればよいでしょうか? まだテストしていませんが、実行可能な回避策は次のようになると思います:

mkdir -p some_dir/a/b
rsync -avz a/b/ some_dir/a/b  # Trailing slash after first 'b'
rsync -avz a/b/c/f some_dir   # No trailing slash after 'f'

また、以下も読むことをお勧めします。シンボリックリンクマニュアルページのセクションrsync

答え2

あなたの動作を再現することはできません。ディレクトリを設定してそれをコピーするスクリプトを作成しました。内部には相対シンボリックリンクと絶対シンボリックリンクがあります。あなたが示したオプション ( -avzR) を使用すると、どちらにも降りず、リンクをリンクとしてコピーするはずです。

私は、あなたが試みていることの一部を誤解していると思います。そのため、それが何であるかがわかったら質問に追加してください。または、このスクリプトを実行して、動作が私が示したものと異なるかどうかを確認してください。

脚本:

#!/bin/sh
SRC=/tmp/syncsrc
DEST=/tmp/syncdest
rm -rf $SRC $DEST
mkdir -p $SRC/a/b
mkdir -p $SRC/f/d
touch $SRC/f/d/e
ln -s ../../f $SRC/a/b/c
ln -s $SRC/f $SRC/a/b/g
mkdir $DEST
rsync -avzRi $SRC/a $DEST

出力

sending incremental file list
cd+++++++++ /tmp/
cd+++++++++ /tmp/syncsrc/
cd+++++++++ /tmp/syncsrc/a/
cd+++++++++ /tmp/syncsrc/a/b/
cL+++++++++ /tmp/syncsrc/a/b/c -> ../../f
cL+++++++++ /tmp/syncsrc/a/b/g -> /tmp/syncsrc/f

そして、宛先は内部のシンボリックリンクで作成されます

$ find /tmp/syncdest \( -type l -printf '%h/%f -> %l\n' \) -o -printf '%h/%f\n'
/tmp/syncdest
/tmp/syncdest/tmp
/tmp/syncdest/tmp/syncsrc
/tmp/syncdest/tmp/syncsrc/a
/tmp/syncdest/tmp/syncsrc/a/b
/tmp/syncdest/tmp/syncsrc/a/b/c -> ../../f
/tmp/syncdest/tmp/syncsrc/a/b/g -> /tmp/syncsrc/f

関連情報