rsync --delete-excluded --prune-empty-dirs と一緒に使用しますが、除外されたディレクトリのみをクリーンアップします。

rsync --delete-excluded --prune-empty-dirs と一緒に使用しますが、除外されたディレクトリのみをクリーンアップします。

私は、Windowsユーザープロファイルをリモートサーバーに複製するために毎晩rsyncを使用してきました。私は--filter='merge <file>'argを使用してインクルード/除外ルールでいっぱいのファイルをロードします。これはブラウザキャッシュと私が知っている役に立たない他のアイテムの転送を防ぐために使用されます。また、--prune-empty-dirs不要な空のディレクトリがたくさん作成されるのを防ぐためにも使用します。

私のスクリプトもこのスイッチを--delete-excluded使用します。これにより、除外する項目をさらに特定した場合、その項目をフィルタファイルに追加でき、次回のジョブの実行時に自動的に削除されます。

しかし、これは除去する副作用があります。みんな空のディレクトリ。アプリケーションが誤って作成され、データを書き込む前にディレクトリが存在するかどうかを確認しないと、問題が発生する可能性があります。

ソース側で実際に空のディレクトリではなく除外したため、空のディレクトリだけを「つかむ」方法はありますか? (関連するディレクトリの数のためにディレクトリ名を明示的に指定するのではなく、単純なルールを使用してこれを実行したいと思います。)

すぐに思い浮かぶ唯一の解決策は次のとおりです。

  1. 廃止されたディレクトリ--prune-empty-dirsと追加のディレクトリが許可されます。
  2. --delete-excludedナイトジョブでの使用を中止し、フィルタファイルを変更するたびに手動で--delete-excluded(使用せずに)実行します。これにより、新しい除外項目が削除され、「実際の」空のディレクトリが再作成されます。--pruneどちらも理想的ではありません。

答え1

除外フィルタの除外により、ターゲット側で空のディレクトリを追加できます。ディレクトリ全体を除外できる場合は、フィルタリング規則がより簡単になり、必要なくなる可能性が--prune-empty-dirsあります。または、ソース側で実際に空のディレクトリのフィルタリストに保護ルールを追加することもできます。 rsyncのマニュアルページから:

グローバル「保護」フィルタを使用すると、特定の空のディレクトリがファイルのリストから削除されるのを防ぎます。たとえば、このオプションは "emptydir"ディレクトリがファイルリストに残っていることを確認します。

--filter '空のディレクトリ保護/'

Protect の省略は大文字で表されるため、Pルールは次のとおりです。

P .stfolder

同期がクリーン.stfolderアップされないようにします。

除外または保護したいフォルダを特定のパターンを使用して識別できる場合を除き、ルールをかなり明示的に指定する必要がありますが、これら2つの方法を組み合わせると、目的の結果が得られます。私の経験によれば、rsyncルールは完全には完全ではありませんが、長年にわたって徐々に改善されています。

関連情報