特定の名前でシンボリックリンクされたディレクトリのみを同期する方法

特定の名前でシンボリックリンクされたディレクトリのみを同期する方法

rsyncとスキーマを扱ういくつかの回答にアクセスしましたが、この特定の問題に対する解決策が見つかりませんでした。リモートシステムに次のようなディレクトリ構造があり、それをローカルディレクトリに再同期したいとします。これは、リモートディレクトリの「最新」部分のみをミラーリングするのと同じです。

root
|-dir_a
| |-LATEST -> version_3
| |-version_1
| |-version_2
| `-version_3
|-dir_b
| |-LATEST -> version_1
|  `version_1
`dir_c
 |-LATEST -> version_3
 |-version_1
 |-version_2
 `-version_3

LATESTは常に最新バージョンのリモコンを指すシンボリックリンクです。現在のrsync --list-onlyシェルスクリプトを使用して出力を処理し、最新バージョンのみを同期しようとしています。少し痛いです。これは、どの--includeパターンを使用してこれを行うことができるかがあると思います--exclude。これを実行できるパターンセットを作成するのに役立つ人はいますか?

また、もはや最新バージョンではなく、古いバージョンを削除する方法を探したいと思います。私のスクリプトはディレクトリに移動し、最新のシンボリックリンクの外にあるディレクトリを見つけて削除します。 rsyncが動作できますか?

答え1

私はこのパターンマッチングが簡単ではないことを学びました。ルートパスのすべてのディレクトリはインクルードLATESTパターンに含める必要があります(--include=*/ --include=*/dir_1/または使用--filter='+ /' --filter='+ /dir_1/')。同様に、他のすべての項目は--exclude=*または)で除外する必要があります--filter='- /unwanted_dir/*

私のスクリプトはまだ出力を解析して、シンボリックリンクがどこに行くのかを--list-only探します。LATESTその後、到達するパスのみが含まれますLATEST

私はLATESTをシンボリックリンクとして取得し、それが指す場所を取得できるようにrsyncにコマンドライン引数を使用することを検討しました。

関連情報