パスのシンボリックリンクを使用した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

関連情報