web-dev-qa-db-ja.com

シンボリックリンクをコピーし、rsyncを使用するように指定します

これはrsyncで行う必要はありませんが、これを行うためのスクリプトを記述する必要はなく、rsyncは私が望むものに非常に近いです。

rsync -a(または-l)はシンボリックリンクを保持でき、-Lは、シンボリックリンクを逆参照して、通常のファイル/ディレクトリであるかのようにコピーできます。しかし、シンボリックリンクを保持し、リンクが指すファイル/ディレクトリをコピーすることは可能ですか?

ここに例があります。次のフォルダ階層があるとします。

dirA/link_to_file -> ../dirB/file
dirA/link_to_dir -> ../dirC
dirB/file
dirB/not_this_file
dirC/file
dirC/file2
dirD/others

そして私がするときrsync -aR dirA dest(または何か他のもの)、これらをdestに正確に表示させたい:

dirA/link_to_file -> ../dirB/file
dirA/link_to_dir -> ../dirC
dirB/file
dirC/file
dirC/file2

これはrsyncで可能ですか?ありがとうございました。

絶対パスを持つ、またはソースディレクトリの外部を指すシンボリックリンクは無視できると仮定します。

11
Wei-Yin

シンボリックリンク名がわかっていて、linkおよびtargetを転送する場合は、次のことができます。

rsync -a 'symlink' .
realdir="$(basename "$(readlink -f 'symlink')")"
rsync -a "$realdir" .

最初のrsyncsymlinkのみを転送します。 2番目のコマンドは実際のディレクトリ名を検索し、2番目のrsyncはディレクトリの内容を転送します。

2
user201564

これは、これらすべてが「mydir」内にあり、「mydir」をある場所から別の場所にrsyncする場合にのみ可能です。 Rsyncは、指定したパスの外にコピーすることはできません(以下のリンクを除く)。例えば

mydir/dirA ...
mydir/dirB ...
...
0
xenoterracide