2つのフォルダを自動的に同期させる方法は?


92

1つのフォルダとそのすべてのサブツリーの同期コピーが欲しいのですが。

このように自動的に機能するはずです。元のフォルダーからコンテンツを作成、変更、または削除するたびに、それらの変更が同期フォルダーに自動的に適用されるはずです。

このタスクへの最良のアプローチはどれですか?

ところで:私はUbuntu12.04を使用しています

最終的な目標は、シンボリックリンクやマウントを使用せずに、個別のリアルタイムバックアップコピーを作成することです。Ubuntu Oneを使用してコンピューター間でデータを同期しましたが、しばらくすると問題が発生し、同期中にすべてのデータが失われました。

そこで、データのバックアップコピーを保持するために、さらにステップを追加することを考えました。

  • データは「フォルダA」に保存しています
  • 「フォルダA」から「フォルダB」への一方向の同期を作成するには、現在の質問に対する回答が必要です(?をcron含むスクリプトはrsync可能性がありますか?)。AからBへの一方向のみである必要があります。Bへの変更をAに適用してはなりません。
  • 私は単に「フォルダーB」を

    UbuntuOneと同期し続けます。このようにして、Aの変更はすべてBにアップルされ、U1から検出され、クラウドに同期されます。何か問題が発生し、U1がBのデータを削除した場合、私は常にAのデータを保持しています。

lanzzのコメントに触発されて、別のアイデアは、起動時にrsyncを実行してUbuntu Oneの下のフォルダーのコンテンツをバックアップし、rsyncが完了した後にのみUbuntuOneを起動することです。

あれについてどう思う?rsyncがいつ終了するかを知る方法は?


何を達成しようとしていますか?フォルダは本当に分離する必要がありますか、ある名前を別の名前にシンボリックリンクしたり、ディレクトリをセカンダリの場所にバインドマウントしたりできませんか?また、これらの検索結果もご覧ください
lanzz 2012

1
cronを介した定期的な同期を優先して、実際のライブ同期(つまり、ソースディレクトリ内のファイルの変更を継続的に監視する)を行わないことをお勧めますrsync
lanzz 2012

回答:


103

inotifywaitmodify,create,delete,moveフラグを有効にして)およびを使用できますrsync

while inotifywait -r -e modify,create,delete,move /directory; do
    rsync -avz /directory /target
done

inotifywaitシステムにない場合は、sudo apt-get install inotify-tools


3
リモートマシンにアクセスするためのトランスポートとしてSSHを使用-e ssh user@remote:/targetするrsync場合は、に追加することを検討してください。
ファルコン

2
@Falconに感謝します、私は通常使用しますrsync -avz --delete --exclude-from=.rsyncignore /directory user@server:path。しかし、私は簡単な答えを書きたかった。
silgon

5
明確にするために:これは1回限りのことですか、それともbashrcなどに追加しますか?
ブラッドジョンソン

1
whileループ全体は、必要に応じて同期するプロセスと見なすことができます。私は通常、作業中のプロジェクトのMakefileに追加します。このようにして、保存するサーバーとディレクトリを選択できます。私のユースケースの1つは、ラップトップでディープラーニングアルゴリズムをプログラムし、それを同期して、より優れたCPUとGPUを備えた専用コンピューターで重いプロセスを実行する場合です。また、.gitフォルダなど、不要なファイルも除外します。
silgon 2018

2
これは、ファイルの名前の変更、使用を処理しないmodify,create,delete,move
urusha

25

次のようなものが必要です。https//github.com/axkibe/lsyncd これはrsyncとinotifyを組み合わせたツールです。前者は、正しいオプションが設定されたディレクトリを最後のビットにミラーリングするツールです。後者は、ディレクトリotファイルへの変更をプログラムに通知するようにカーネルに指示します。それは言う:

イベントを数秒間集約して結合し、1つ(または複数)のプロセスを生成して変更を同期します。

しかし、https://www.digitalocean.com/community/tutorials/how-to-mirror-local-and-remote-directories-on-a-vps-with-lsyncdのDigital Oceanによると、 Ubuntuリポジトリ!

同様の要件がありますが、まだ試していませんが、このツールはこのタスクに適しているようです。


1
lsyncdは最初は特効薬のように見えましたが、未解決の問題たくさんあり、macOSの実装は「古くて時代遅れ」であるようです。10.12で動作させることができませんでした。
有料オタク

@apaidnerd公平を期すために、90号がオープンで、420号がクローズです。ただし、昨年は10/40号のみがクローズされました。
MateenUlhaq20年

8

@silgonの答えの単純な変更:

while true; do 
  inotifywait -r -e modify,create,delete /directory
  rsync -avz /directory /target
done

(@silgonバージョンをcronで実行すると、Ubuntu 16でクラッシュすることがあります)


2
なぜcronで実行するのですか?
saygley 2018

@saygley特定のタスクについては、Ubuntuの再起動後、同期プロセスを自動的に実行する必要があります
Denis

5
なるほど。それでも、これは通常1回起動し、サーバーが稼働している限り実行する必要があるためです。代わりに、rc.local内にインライン化されたものを検討します。
saygley 2018

2

fschangeを利用できます。これはLinuxファイルシステムの変更通知です。ソースコードは上記のリンクからダウンロードできます。自分でコンパイルできます。fschangeprocファイル(/ proc / fschange)からデータを読み取ることにより、ファイルの変更を追跡するために使用できます。データがファイルに書き込まれると、fschangeは、ファイルが変更されたとだけ言うのではなく、変更された正確な間隔を報告します。より高度なソリューションをお探しの場合は、ResilioConnectを確認することをお勧めします。クロスプラットフォームであり、使用と監視のための拡張オプションを提供します。BitTorrentベースであるため、他の既存の同期ツールよりも高速です。それは彼らに代わって書かれました。


0

この無料のプログラムを使用して、ローカルファイルとディレクトリを同期します:https//github.com/Fitus/Zaloha.sh。リポジトリには簡単なデモも含まれています。

良い点:これはbashシェルスクリプトです(1つのファイルのみ)。他のプログラムのようなブラックボックスではありません。ドキュメントもあります。また、技術的な才能があれば、それを「曲げ」て「統合」し、好みの最終ソリューションを作成することができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.