rsync、受信側から送信側から削除したファイルを削除します。 (ただし、全て削除しないでください)

rsync、受信側から送信側から削除したファイルを削除します。 (ただし、全て削除しないでください)

rsyncを使いたいのですが…

  • 受信側から送信側でも削除したファイルを削除します。
  • 受信側のrsyncedディレクトリにある他のファイルを削除しないでください。

たとえば、次のようなディレクトリがあるとしますlocal-src

今後: local-src地域を含める...

a.txt
b.txt
c.txt

コンテンツを同期したいリモートディレクトリlocal-srcはですremote-src

今後: remote-srcリモコンには以下が含まれています。

a.txt
b.txt
c.txt
d.txt
README.md

一部のファイルを削除するとしますlocal-src

ローカル削除後: local-src地域を含める...

c.txt

rsyncを使用して、ソースから削除されたファイルはターゲットから削除されますが、ターゲットの他のファイルは削除されないようにする方法です。たとえば、目的地で次のようにします。

ローカル削除後: remote-srcリモコンには以下が含まれています。

c.txt
d.txt
README.md

つまり、リモートでも削除されますが、別々にa.txt保存されます。b.txtd.txtREADME.txt

rsyncを使ってこれを達成する方法はありますか?

編集する:結論は、rsyncではこれを行うことは不可能であるようです。これがなぜ必要なのか尋ねられましたが、ユースケースを説明すると次のようになります。

Webサーバーがあるとしましょう。そのWebサーバーには複数のディレクトリがあります。ディレクトリApublic_html私のウェブサイトを提供するディレクトリがあるとしましょう。ディレクトリにファイルを生成する自動化されたプロセスがあるとしますA。生成されたファイルをrsync(または他のツールを使用して同期)したいと思います。修正するArsyncが誤って私のサイトをpublic_html削除しpublic_htmlたくありません。

rsyncがそのタスクに適したツールではない場合、これを行う方法を知っている人はいますか?

答え1

やりたいことは合理的ですが、一人でやることrsyncは合理的ではありません。だから答えはいいえ

理由は簡単です。rsync各ディレクトリのコンテンツ履歴を維持しない場合は、削除すべきコンテンツと削除しないコンテンツを知る方法はありません。追加のサポートなしでは不可能です。

なぜこれを楽しむのか、自分に尋ねて、rsyncより明確に説明する必要があります。よりスマートなプログラムもありますlibrsync1.so


不要な緩い制約を使用すると、rsync次のことがわかります。rdiff バックアップ:

mkdir a
touch a/xx
touch a/yy
rdiff-backup a b
ls b 

が表示され、配置xxyyれますb

touch b/zz
rm a/xx
rdiff-backup a b

これが表示さxxれ、zz場所が指定されますb。変更をロールバックできるようにディレクトリもrdiff-backup保持され、コマンドを使用して定期的に消去する必要があります。 (この例では、ローカルファイルを使用してターゲットの追加データが削除されないことを示していますが、rdiffバックアップはネットワーク経由で実行することもできます。)rdiff-backup-databrdiff-backup


別のオプションは、分散バージョン管理システム(mercurial、bazaar、git)を設定することです。たとえば、Mercurialを使用すると、すべての変更をサーバーにプッシュし、チェックアウトされたファイルを更新し、リモートサーバー上の他のファイル(しかしリビジョン制御の対象ではないファイル)を無視するスクリプト(私はMakefileを使用します)持つことができます。 )。

サーバーは次のことを行います。

hg init
hg add file_list_excluding_that_should_not_should_be_deleted_if_not_on_client
hg commit -m "initial setup"

クライアント側から:

hg clone ssh://username@server/dir_to_repository

クライアントからファイルを削除して次のようにします。

hg commit -m "removed file"
ssh username@server "cd dir_to_repository; hg update --clean"

削除したファイルはサーバーから削除されますが、ストレージに追加されていない他のデータは削除されません。

答え2

rsyncコマンドの一部として受信側のファイルを明示的に除外しないと、これは可能ではないと思います。 rsyncのマニュアルページのセクション「ディレクトリ固有のルールと削除」を参照してください。

削除オプションがない場合、ディレクトリ固有のルールは転送側にのみ適用されるため、転送に影響を与えずにマージされたファイル自体を自由に除外できます。これを容易にするために、「e」修飾子は次の2つの同等のコマンドに示すようにこの除外を追加します。

          rsync -av --filter=': .excl' --exclude=.excl host:src/dir /dest
          rsync -av --filter=':e .excl' host:src/dir /dest

ただし、受信側で削除を実行し、特定のファイルを削除から除外する場合は、受信側から除外するファイルを知っていることを確認する必要があります。最も簡単な方法は、転送時に各ディレクトリにマージされたファイルを含め、--delete-afterを使用することです。これにより、受信者はアイテムを削除する前に送信者と同じ除外ルールを取得します。

          rsync -avF --delete-after host:src/dir /dest

ただし、マージされたファイルが転送の一部ではない場合は、一部のグローバル除外ルール(コマンドラインなど)を指定するか、受信側でこれを実行する必要があります。最初の例は次のとおりです(リモートの.rulesファイルが自分自身を除外すると仮定)。

   rsync -av --filter=’: .rules’ --filter=’. /my/extra.rules’
      --delete host:src/dir /dest

上記の例では、extra.rulesファイルはトランスポートの両方に影響を与える可能性がありますが、ルール(送信側)は各ディレクトリマージルールの後に指定されるため、.rulesファイルでマージされたルールが適用されます。

最後の例では、リモート側は転送から.rsync-filterファイルを除外しますが、独自の.rsync-filterファイルを使用して受信側から削除するエントリを制御しようとしています。これを行うには、ディレクトリごとにマージされたファイルを具体的に除外し(削除されないように)、削除しないその他の項目を制御する規則をローカルファイルに配置する必要があります。次のコマンドのいずれかと同じです。

       rsync -av --filter=':e /.rsync-filter' --delete \
           host:src/dir /dest
       rsync -avFF --delete host:src/dir /dest

答え3

私が正しく理解したなら、これは--excludeあなたが探しているものかもしれません。

$ ls src dst
dst:
a.txt  b.txt  c.txt  d.txt  README.md

src:
c.txt
$ rsync --update --delete --recursive --exclude="d.txt" --exclude="README.md" src/ dst
$ ls src dst
dst:
c.txt  d.txt  README.md

src:
c.txt

答え4

これに対する答えがあります。うまくいくと思います。これは私にとって効果的です。まず、rsyncリモートファイルをローカルファイルに転送する必要があります。その後、ローカル側にはすべてのファイルが含まれます。

sudo rsync -r -a -v --delete /[email protected]:/remote_dir/ /local_dir/

今は地元で

a.txt
b.txt
c.txt
d.txt
README.md

その後、ファイルを削除したり、必要な操作を実行したりできます。 (ローカル側から)。あなたの質問からこれらのファイルを削除しました。

削除されたファイル

a.txt
b.txt

rsyncその後、ローカルファイルをリモート側に転送できます。これにより、両方の側に同じ文書があります。

sudo rsync -r -a -v --delete /local_dir/ [email protected]:/remote_dir/

それを与える

c.txt
d.txt
README.md

リモート側とローカル側のファイル。 (--deleteリモート側とローカル側の他のファイルは、以下を使用して削除できます。遠隔一致しない地域側)。

関連情報