送信側に存在しないファイルを削除するには、受信側にrsyncを要求しましたが、受信側で例外が発生しました。

送信側に存在しないファイルを削除するには、受信側にrsyncを要求しましたが、受信側で例外が発生しました。

私は次のトピックを読んだ。

しかし、私が知っている限り(何か落ちたかもしれない)、次の問題は扱いません。

rsync送信側、受信側に存在しないファイルのコピーおよび削除を要求する方法(例外)は何ですか? (たとえば、.hg送信側にリポジトリがない場合でも、受信側のMercurialリポジトリを削除しないでください。)

一つの可能​​性は?

下記@Richard Hollowayの回答を借りてください。次のような行があるとしましょう。

rsync -av --exclude=dont_delete_me --delete /sending/path /receiving/path

rsync私が理解したように、この行はトランスポートパスにないすべてのエントリを削除しますdont_delete_me。今私の質問は、rsyncが受信側で同じままであるかどうかです。dont_delete_me 送信者が一致するものがない場合でも同じですかdont_delete_me

答え1

--deleteとを使用すると、--exclude元のファイルを削除しても除外された場所の内容は削除されません。

rsyncただし、これによりフォルダがまったく削除されない問題が発生します。したがって、そのフォルダrsyncに対して他の作業が必要ですsync

例えば。

rsync -nav /home/richardjh/keepall/ /home/backup/richardjh/keepall/
rsync -nav --exclude=keepall --delete /home/richardjh /home/backup/richardjh

これを反対方向に実行することもできますが、削除されたファイルをすべて削除してから置き換えるので、それほど効率的ではありません。

ライナーではできません。

答え2

私の目的に適した次の解決策を見つけました。

rsync -r --exclude-from=do_not_send_to_dest --delete --exclude-from=do_not_modify_in_dest src/ dest

(注:-nテスト実行を実行するオプションを追加して--deleteに変更しないでください--delete-excluded。)

このコマンドを実行すると、次の属性が生成されます。

  • ソースsrcディレクトリは変更されず、そのまま残ります。
  • ターゲットdestフォルダは、以下を除いてソースフォルダと一致します。

    • リスト内のアイテムはターゲットdo_not_send_to_destに送信されません。
    • リスト内の項目は、do_not_modify_in_destターゲットで変更されていないままです。
  • (注:存在しないプロジェクトが " "ファイルにリストされていても問題はありませんdo_not_。)

説明する

rsyncがコマンドライン引数を左から右に読み取ると、引数のため--deleteにrsyncが内部的に(ある意味では)「モード切り替え」を行い、オプションを再利用できるようになるように見えますが、--exclude-from意味は異なります。

警告する:

  • リスト内のアイテムがdo_not_send_to_destすでにターゲットにある場合は、次の操作を行います。

    • このコマンドはターゲットからプロジェクトを削除しません(プロジェクトがソースディレクトリから最初に削除されない限り)。
    • 警告する:--deleteに変更すると、両方のリストのいずれ--delete-excludedかにリストされているターゲットのすべてのコンテンツが削除されます。 xD(rsyncはオープン/フレキシブルに書かれていますが、いくつかのニュアンスはありますか?)

軽い使用テスト。

「」を使用していますrsync version 3.0.9 protocol version 30

関連情報