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"

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

おすすめ記事