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


11

これはで行う必要はありませんが、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ですか?ありがとうございました。

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


1
私はあなたの要求が指定不足だと思う:あなたは、以下の場合にすることを要求dirA/linkへのシンボリックリンクである../dirB/file場合、これはコピーとして扱われるべきdirB/fileまでdest/dirB/filedirA/linkしますdest/dirA/linkdirA/linkへのリンクはどうなり../../another_fileますか?一般dirA/linkに、ディレクトリツリーの上位にあるディレクトリを指している場合はどうなりますか?
Riccardo Murri

良いキャッチ。私の使用例では、ツリーの外部へのリンクポイントはなく、リンクに絶対パスはありません。
Wei-Yin

1
私はそれについて考えれば考えるほど、標準的なユーティリティではこれを実行できないと思います。一般的なケースでは、それはあなたがそのターゲット(シンボリックリンクが含まれているシンボリックリンクへのシンボリックリンクまたはより一般的にシンボリックリンクを持っている場合は、単一のソース与えられた目的地を大量に作成する必要があります例えばa -> bb -> c/fooc -> d/e:コピーへの要求aもコピーする必要がありますbcc/foodd/eおよびd/e/foo)。
Gilles「SO-邪悪なことをやめなさい」

@ギレス:はい、あなたは正しいです。リンクを追跡すると、まだソースディレクトリ内にある限り、多くのファイルが含まれる可能性があります。
魏殷

回答:


2

シンボリックリンク名がわかっていて、リンクターゲットを転送したい場合は、次のことができます。

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

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


0

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

mydir/dirA ...
mydir/dirB ...
...

はい、この仮定は私のユースケースに適合しています。すべてのリンクはmydir内にあります。
Wei-Yin

@ Wei-Yinは、シンボリックリンクをたどらないように単に指示します...または、何かを誤解しました
xenoterracide

@xenoterracide:rsyncをどのように呼び出しても、ソースごとに1つの宛先が作成されると思います(先頭のディレクトリの作成を除く)。しかし、Wei-Yinは、リンクそのターゲットという2つ以上の宛先を作成したいと考えています。
Gilles 'SO-悪をやめる'

どうやら私は混乱しています...
xenoterracide

@ギレス:とにかくターゲットを同期するので、rsyncがシンボリックリンクをたどる必要はありませ。したがって、最初にシンボリックリンクをコピーし、ぶら下がっているシンボリックリンクを作成します。次に、シンボリックリンクのターゲットを含め、ディレクトリ内の他のすべてをコピーします。出来上がり、すべてがうまく調和しています。
Martin v。Löwis
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.