rsync を使用して特定のシンボリック リンクのみをコピーしますか?

rsync を使用して特定のシンボリック リンクのみをコピーしますか?

rsync を使用してコピーしたいフォルダー構造があり、その構造は一連のバックアップであり、その中から最新のもの (シンボリック リンクを使用して識別可能) のみをコピーしたいとします。次のようになります。

/backups
    /foo
        /2019-05-01
        /2019-06-01
        /latest -> 2019-06-01
    /bar
        /2019-05-20
        /2019-06-20
        /latest -> 2019-06-20

私がやりたいのは、単一のrsyncコマンドを使用して、コピーすることですのみ各フォルダからのバックアップlatestを作成し、それ以外は構造を模倣します。このために、次のコマンドを思いつきました。

rsync -rptgoDLm --include '*/' --include '/*/latest/**' --exclude '*' user@remote:/backups /some/local/path

--copy-links基本的には、ブランチのみを選択する/*/*/latest(および大量の空のディレクトリ構造を回避する)ための include/exclude トリックがいくつか含まれたアーカイブ-mです。これは、1 つの問題を除いて正常に動作します。これらのブランチのいずれかにシンボリック リンクが含まれている場合、単純なシンボリック リンクとしてではなく、これらもターゲットとしてコピーされます。

私が本当にできることはのみ--copy-linksシンボリック リンクには の動作を使用し、その他の遭遇するすべての場合にlatestは別の動作 ( など) を使用します。--links

単一の rsync コマンドでそのようなことは可能ですか? 私の目標は、 の直接の内容を知らなくてもこれを実行できるようにして/backups、何か新しいもの (例: ) を追加すると/backups/baz自動的にコピーされるようにすることです。

アップデート: 明確にするために、宛先で確認したいディレクトリ構造は次のようになります。

/backups
    /foo
        /latest
    /bar
        /latest

つまり、ターゲット上の各バックアップの最新バージョンのみが必要です (ターゲット自体は別の方法でバックアップ履歴を処理します)。

答え1

これはあなたの要件に合っているようです

rsync -avR user@remote:'/backups/*/latest/' /some/local/path/

この-Rフラグは、ソース パス全体を宛先に効果的に「コピー」し、結果として得られるバックアップは として保存されます/some/local/path/backups/{whatever}/latest

ソース パス全体が必要ない場合は、 を含めて、/./パスをコピー先にコピーするポイントを示すことができます。たとえば、 は(つまり、コンポーネントがスキップされた)/backups/./foo/latest/になります。ドキュメント ( ) には、さらに詳しい情報が記載されています。/some/local/path/foo/latest//backupsman rsync

関連情報