
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.txt
d.txt
README.txt
rsyncを使ってこれを達成する方法はありますか?
編集する:結論は、rsyncではこれを行うことは不可能であるようです。これがなぜ必要なのか尋ねられましたが、ユースケースを説明すると次のようになります。
Webサーバーがあるとしましょう。そのWebサーバーには複数のディレクトリがあります。ディレクトリA
とpublic_html
私のウェブサイトを提供するディレクトリがあるとしましょう。ディレクトリにファイルを生成する自動化されたプロセスがあるとしますA
。生成されたファイルをrsync(または他のツールを使用して同期)したいと思います。修正するA
rsyncが誤って私のサイトを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
が表示され、配置xx
さyy
れますb
。
touch b/zz
rm a/xx
rdiff-backup a b
これが表示さxx
れ、zz
場所が指定されますb
。変更をロールバックできるようにディレクトリもrdiff-backup
保持され、コマンドを使用して定期的に消去する必要があります。 (この例では、ローカルファイルを使用してターゲットの追加データが削除されないことを示していますが、rdiffバックアップはネットワーク経由で実行することもできます。)rdiff-backup-data
b
rdiff-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
リモート側とローカル側の他のファイルは、以下を使用して削除できます。遠隔一致しない地域側)。