webdevqa.jp.net

rsyncとシンボリックリンク

cronジョブを使用してrsyncを実行し、ホームディレクトリを夜間外付けドライブにバックアップしたいです。 rsyncのシンボリックリンクフラグの正確な振る舞いがわからない。

  1. rsync-aフラグは-lフラグを含みます(すなわち「シンボリックリンクをシンボリックリンクとしてコピーする」)。これは単にリンクをコピーするという意味ですか、またはリンクをたどってリンク先ディレクトリ内のすべてをコピーするという意味ですか?何百ギガバイトもコピーすることを含むメディアファイルでいっぱいのディレクトリへのリンクがあるので、私はそれを避けたいと思います。
  2. rsync -aがそれらすべてのメディアファイルをコピーすることを恐れて(しかし確実ではありません)、代わりに--no-linksフラグを追加しました。これは私が望む行動ではないようです。コピーしたいリンクがあるため、問題のあるリンクのコピーは無視されます(たとえば、異なるプロジェクトディレクトリからの共通ヘッダーファイルへのリンク)。
  3. 上記の#1(--no-linksフラグなし)が本当に必要なものであり、リンク先ファイルをコピーせずにリンクをコピーするだけの場合、リンクはバックアップ時に壊れますか?例えば、私はrsyncソースディレクトリ/home/me/projects/misc/media/extdrive/backup/home/me/projects/miscにするかもしれません。この場合、私はrsyncが賢いとは限らないし、相対的なディレクトリの変更に対してシンボリックリンクの内容を修正しようともしないと思います。これは正しいです?これは問題ありません。リンクが修復される必要があるときに修正されて機能する限り、バックアップディレクトリでリンクが壊れていても問題ありません。
60
sean
  1. 「シンボリックリンクをシンボリックリンクとしてコピーする」とは、まさにその意味を表しています。rsyncがソースディレクトリにシンボリックリンクを見つけた場合は、コピー先に同じシンボリックリンクが作成されます。 これ以上何もない

    (マニュアルページの数行下の異なるオプション、--copy-linksは反対の動作(常にデータをコピーする)について説明していますが、これは望ましくないと説明したものです。)

    "シンボリックリンク"の節も参照してください。

    --linksが指定されている場合、シンボリックリンクは宛先上の同じターゲットで再作成されます。

  2. --linksの動作を誤って解釈しているため、間違った動作を要求されているため、望みの動作ではありません(回答1を参照)。

  3. デフォルトでは、コピー先を正確にコピーします。

    つまり、リンクが絶対パス(例:/home/me/projects)を指している場合は、同じパスを指し続けます。それは壊れることはありません、それはあなたのホームディレクトリのバックアップではなくむしろファイルを指し続けるでしょう。

    一方、リンクが相対パス(例えば../../projects)を指している場合、それはまた同じパスを指し続けますが、それはシンボリックリンクの場所からの相対パスなので、バックアップのシンボリックリンクバックアップ内のファイルも指しています。

    残念ながら、絶対ベースのシンボリックリンクを新しいベースに変換するためのオプションはないようです(それらを完全に分割するためのオプションのみ)。問題を回避するには、既存のシンボリックリンクを相対リンクに変更する必要があります(これは一般に、$ HOME内のリンクに適しています)。

82
grawity

@grawityは素晴らしい答えを持っていますが、ここにドキュメントからいくつかの関連情報のスクリーンショットがあります。これが-l-Lオプションの正確な言葉遣いです、例えば、これは問題の中で最も関連性があるようです:

enter image description here

ソース: https://linux.die.net/man/1/rsync 、またはLinuxのman rsyncマニュアルページ。

また、-a--archive)オプションには-lオプションも含まれていることに注意してください。これは、-lオプションを使用して、ソースからのシンボリックリンクをデスティネーション上のシンボリックリンクとして保存するのがとても好きだからです。 manページから:

-a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)
4
Gabriel Staples