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/
/backups
man rsync