cron
ジョブを使用してrsync
を実行し、ホームディレクトリを夜間外付けドライブにバックアップしたいです。 rsync
のシンボリックリンクフラグの正確な振る舞いがわからない。
rsync
の-a
フラグは-l
フラグを含みます(すなわち「シンボリックリンクをシンボリックリンクとしてコピーする」)。これは単にリンクをコピーするという意味ですか、またはリンクをたどってリンク先ディレクトリ内のすべてをコピーするという意味ですか?何百ギガバイトもコピーすることを含むメディアファイルでいっぱいのディレクトリへのリンクがあるので、私はそれを避けたいと思います。rsync -a
がそれらすべてのメディアファイルをコピーすることを恐れて(しかし確実ではありません)、代わりに--no-links
フラグを追加しました。これは私が望む行動ではないようです。コピーしたいリンクがあるため、問題のあるリンクのコピーは無視されます(たとえば、異なるプロジェクトディレクトリからの共通ヘッダーファイルへのリンク)。--no-links
フラグなし)が本当に必要なものであり、リンク先ファイルをコピーせずにリンクをコピーするだけの場合、リンクはバックアップ時に壊れますか?例えば、私はrsync
ソースディレクトリ/home/me/projects/misc
を/media/extdrive/backup/home/me/projects/misc
にするかもしれません。この場合、私はrsync
が賢いとは限らないし、相対的なディレクトリの変更に対してシンボリックリンクの内容を修正しようともしないと思います。これは正しいです?これは問題ありません。リンクが修復される必要があるときに修正されて機能する限り、バックアップディレクトリでリンクが壊れていても問題ありません。「シンボリックリンクをシンボリックリンクとしてコピーする」とは、まさにその意味を表しています。rsyncがソースディレクトリにシンボリックリンクを見つけた場合は、コピー先に同じシンボリックリンクが作成されます。 これ以上何もない
(マニュアルページの数行下の異なるオプション、--copy-links
は反対の動作(常にデータをコピーする)について説明していますが、これは望ましくないと説明したものです。)
"シンボリックリンク"の節も参照してください。
--links
が指定されている場合、シンボリックリンクは宛先上の同じターゲットで再作成されます。
--links
の動作を誤って解釈しているため、間違った動作を要求されているため、望みの動作ではありません(回答1を参照)。
デフォルトでは、コピー先を正確にコピーします。
つまり、リンクが絶対パス(例:/home/me/projects
)を指している場合は、同じパスを指し続けます。それは壊れることはありません、それはあなたのホームディレクトリのバックアップではなくむしろファイルを指し続けるでしょう。
一方、リンクが相対パス(例えば../../projects
)を指している場合、それはまた同じパスを指し続けますが、それはシンボリックリンクの場所からの相対パスなので、バックアップのシンボリックリンクバックアップ内のファイルも指しています。
残念ながら、絶対ベースのシンボリックリンクを新しいベースに変換するためのオプションはないようです(それらを完全に分割するためのオプションのみ)。問題を回避するには、既存のシンボリックリンクを相対リンクに変更する必要があります(これは一般に、$ HOME内のリンクに適しています)。
@grawityは素晴らしい答えを持っていますが、ここにドキュメントからいくつかの関連情報のスクリーンショットがあります。これが-l
と-L
オプションの正確な言葉遣いです、例えば、これは問題の中で最も関連性があるようです:
ソース: 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)