web-dev-qa-db-ja.com

賢明な動きを処理するRsync

私はrsyncを使用してラップトップとネットブックの間でホームディレクトリを同期しています(両方ともLinuxでext4を使用しています)。私の唯一の問題は、時々特定のディレクトリを完全に再編成したいということです。rsyncはこれを新しいファイルの削除と作成と見なし、非常に遅く非効率的になります。

ファイルの移動をうまく処理する優れたソフトウェアを知っている人はいますか?

nisonはこれを実行できるはずですが、実際には機能していないようです。私は、それぞれが大きなファイルを含む2つのローカルディレクトリを同期することによってnisonをテストしましたが、それでも削除+作成として私の移動を検出し、実際にはrsyncよりもさらに遅くなりました。 。

さらに、数か月前にnisonのソースコードを見て正しく覚えていれば、sha sumsを実行するようなことを試みましたが、理想的なソリューションでshaを実行することは望んでいません。合計—大きなファイル/ディレクトリでは遅すぎます。私は次のようなことに気づくものをお願いします:

「このファイルの最後のソース対応物が削除されたようで、ソースディレクトリツリーの他の場所に同じmdate、サイズ、iノード番号を持つ新しいファイルがあるので、これは移動であり、削除+コピーを実行する代わりに、それに応じてターゲットの対応物を移動します。」

これらのマシンをすばやく同期できることが私にとって重要です。

助言がありますか?

10
PSkocik

rdiff-backup 下でrsyncを実行しますが、必要な追加のインテリジェンスを備えています(増分バックアップをロールバックできるようにしますが、次のように構成できます)。オフに切り替えます)。

最新のリリースは古い(2009)ですが、それは安定性の表れです。

6
Zelda

Unisonは必要なことを実行しますが、リモート同期の場合のみです。ルートの1つとしてssh://localhost/path/to/dirを使用してみてください。

Unisonはファイルの内容に基づいて決定を行いますが、iノード番号を追跡しません。

ソースディレクトリとターゲットディレクトリのファイルシステムがハードリンクをサポートしている場合は、rsyncを使用して移動および名前変更されたファイルを処理できます。アイデアは、実際の転送の前にrsyncにハードリンクを再構築させることです。あなたは良い説明を見つけることができます ここ

ソース/ターゲットディレクトリ内にハードリンクの非表示ツリーを作成する単純なソリューションになりました。基本的なスクリプトは次のようになります。

# Name of hidden directory
Shadow=".rsync_shadow"

# do real sync
rsync -ahHv --stats --no-inc-recursive --delete --delete-after "$Source"/ "$Target"

# update/create hidden dir of hard links in source
rsync -a --delete --link-dest="$Source" --exclude="/$Shadow" "$Source"/ "$Source/$Shadow"

# update/create hidden dir of hard links in target
rsync -a --delete --link-dest="$Target" --exclude="/$Shadow" "$Target"/ "$Target/$Shadow"

GitHub にサンプルスクリプトがあります。ただし、本番環境でこの方法を使用する前に、大量のテストを行うことをお勧めします。

1
dparoli

複数のマシン間でファイルを同期する場合は、Subversion(またはバックエンドとしてSVNを使用するFSVS)などの集中型バージョン管理システムを使用することをお勧めします。/home内のすべて(バージョン管理に追加するもの)がバージョン管理され、他のマシンと簡単に同期したり、ロールバックしたりできるのは素晴らしい点です。

0
tgharold

lsyncdは、rsync + sshの動作で移動されたファイルも処理しますが、多少バグがあります(約15%の移動が削除/コピーとして処理されますが、理由はわかりません)。ほとんどの場合、機能します。

0
NK Support