rsyncは同期対象を正確にどのように決定しますか?


14

私は質問に対する複数の答えを見つけているので、ランダムな半役に立たない情報を記入して最大のブログを作りたいのではなく、実際にそれを使用する人々に尋ねたいと思いました。

シナリオ:私rsync -av --progress /dir/a /dir/b とそれはそれを 行います。

/ dir / aに新しいファイルを追加し、同じコマンドを再度実行します。何が行われたかを認識し、新しいファイルのみをコピーします。

/ dir / aに新しいファイルを追加し、/ dir / bのいくつかのファイルの名前を変更し、おそらくいくつかを削除します。

rsync -av --progress /dir/a /dir/bもう一度実行すると、何がコピーされますか?以前にコピーしたものを知っているための新しいファイル、または名前が変更/削除されたファイルも存在しないためです。

また、ボーナスとして、以前にコピーしたファイル再度コピーする場合、/ dir / aへの新しい追加のみコピーされるように、それを防ぐ方法はありますか?

現時点では、手動で物事を確認できてうれしいですが、データが大きくなるにつれて、このタスクを実行するためにより多くの自動化が必要になります。


3
-iフラグは非常に便利です。すべてのファイルに対して、デコードされた一致文字列を提供して、一致した理由を確認します(mod時間のフラグ、サイズのフラグなど)
BowlOfRed

回答:


17

/ dir / aに新しいファイルを追加し、同じコマンドを再度実行します。何が行われたかを認識し、新しいファイルのみをコピーします。

いいえ、前回の実行で何をしたのかわかりません。受信側のデータと送信するデータを比較します。十分に小さいデータでは、これは明らかではありませんが、十分な大きさのディレクトリがある場合、コピーが実際に開始される前に比較に費やされた時間が簡単に感じられます。

デフォルトのチェックでは、ファイルの変更時間とサイズがチェックされます。からman rsync

-c, --checksum
      This changes the way rsync checks if the files have been changed
      and  are in need of a transfer.  Without this option, rsync uses
      a "quick check" that (by default) checks if each file’s size and
      time of last modification match between the sender and receiver.
      This option changes this to compare a 128-bit checksum for  each
      file  that  has a matching size.  Generating the checksums means
      that both sides will expend a lot of disk I/O  reading  all  the
      data  in  the  files  in  the transfer (and this is prior to any
      reading that will be done to transfer changed  files),  so  this
      can slow things down significantly.

そして:

-u, --update
      This  forces  rsync  to  skip  any  files  which  exist  on  the
      destination  and  have  a  modified  time that is newer than the
      source  file.   (If  an  existing   destination   file   has   a
      modification time equal to the source file’s, it will be updated
      if the sizes are different.)

これらは、使用したオプションによって暗示されないことに注意してください。-aは:

-a, --archive               archive mode; same as -rlptgoD (no -H)
-r, --recursive             recurse into directories
-l, --links                 copy symlinks as symlinks
-p, --perms                 preserve permissions
-o, --owner                 preserve owner (super-user only)
-g, --group                 preserve group
    --devices               preserve device files (super-user only)
    --specials              preserve special files
-D                          same as --devices --specials
-t, --times                 preserve times

今まで見た中で最高の説明、ありがとう
-SPooKYiNeSS

2
少し追加。名前が変更されたファイルは、両端で一意のファイルとして扱われます。--fuzzy一度指定すると、同じディレクトリで同じものとして認識されます。--fuzzy2回使用すると、この機能が他の場所に拡張されます。詳細man rsyncを参照してください。もちろん、使用する主な理由の1つは、rsync変更されたファイルの部分のみをコピーする機能です。これにより、ネットワークを介した転送がはるかに高速になります。ところで、チェックサムオプションは、どのようにrsync機能するかの説明のために上記で言及されています。ほとんどの場合、使用しないでください。
ジョー

6

全般

私が正しく理解している場合、rsync -avメモリがないため、ソースには存在するがターゲットには存在しないため、名前変更/削除されたファイルもコピーします。

チップ

  • オプション-n'dry run'を使用して、実行する前に何が起こるかを確認しますrsyncコマンドライン。

  • ソースディレクトリの後に続くスラッシュの特別な意味に注意してください。

    rsync -av --progress dir/a/ dir/b
    

    そして

    rsync -av --progress dir/a dir/b
    

    マニュアルに記載されています man rsync

特別な場合(ソースディレクトリ 'a'にファイルを追加し、ターゲットディレクトリ 'b'からファイルを削除)は、追加されたファイルと以前にコピーされたファイルの両方を追加します。これはオプションの有無にかかわらず発生します-ursync。ソースディレクトリに保持したい場合、これを簡単に修正するオプションはわかりません。

ただし、ソースディレクトリから削除するか、ファイルにファイル名を入力してexcluded、オプション--exclude-from=excluded(多くのファイル)を使用するか、単に--exclude=PATTERN1つまたはいくつかのファイルに対して使用できます。

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-2

sent 103 bytes  received 25 bytes  256.00 bytes/sec
total size is 13  speedup is 0.10 (DRY RUN)

$ rsync -av --progress dir/a/ dir/b
sending incremental file list
./
file-1
              6 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=1/3)
file-2
              7 100%    6.84kB/s    0:00:00 (xfr#2, to-chk=0/3)

sent 196 bytes  received 57 bytes  506.00 bytes/sec
total size is 13  speedup is 0.05

$ echo textx-3>./dir/a/file-3

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-3

sent 121 bytes  received 22 bytes  286.00 bytes/sec
total size is 21  speedup is 0.15 (DRY RUN)

$ rm dir/b/file-1 
rm: ta bort normal fil 'dir/b/file-1'? y

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-3

sent 124 bytes  received 25 bytes  298.00 bytes/sec
total size is 21  speedup is 0.14 (DRY RUN)

$ rsync -avun --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-3

sent 124 bytes  received 25 bytes  298.00 bytes/sec
total size is 21  speedup is 0.14 (DRY RUN)

$ rsync -avun --exclude=file-1 --progress dir/a/ dir/b
sending incremental file list
./
file-3

sent 104 bytes  received 22 bytes  252.00 bytes/sec
total size is 15  speedup is 0.12 (DRY RUN)

代替案: unison

同期ツールunisonであるツールをテストすることもできます。特別なケースを識別し、何をすべきかを決定する視覚的な方法を提供します。GUIバージョン()があります。unison-gtk


良い例ありがとう。私は、私はアプリからこれを求めている最後の事で/を知っていたし、それを逃した(そして、あなたは明確に私はちょうどコピーした見ることができます/投稿
SPooKYiNeSS

そして、それは私が終了する前に送信し、私のコメントを編集させません... 2番目のものをコピー/貼り付けました。私はunusonを見て、それが私が望むことをすることができるかどうかを確認し、そうでない場合はプランbに戻ってスクリプトを作成します
-SPooKYiNeSS

私はunison-gtk数年間使用していますが、満足しています。(私も使用しrsyncます。)
sudodus

1

/ dir / aの新しいファイルのみをコピーします。--deleteオプションを使用しない限り、/ dir / bで行うことはすべて無視されます。その場合、/ dir / bの名前が変更されたファイルは削除されます。/ dir / bが/ dir / aのようになります。

ボーナスについては、/ dir / aのファイルの名前を変更し、/ dir / bにrsyncする場合のようになりますか?その場合、rsyncが再びファイルをコピーするのを防ぐ方法はないと思います。


属性を使用して決定する以外に方法があるとは思っていませんでしたが、子供用スクリプトを作成していて、もう必要がある場合は。でも答えてくれてありがとう、少なくとも私は今やるべきことを知っている。
SPooKYiNeSS
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.