web-dev-qa-db-ja.com

rsync:--size-onlyと--ignore-timesの違い

2つのオプションの違いを理解しようとしています。

rsync --size-only

そして

rsync --ignore-times

デフォルトでは、rsyncはタイムスタンプとファイルサイズの両方を比較して、ファイルを同期するかどうかを決定することを理解しています。上記のオプションにより、ユーザーはこの動作に影響を与えることができます。

両方のオプションは、少なくとも口頭では同じ結果になると思われます:サイズのみで比較

ここに微妙な何かが欠けていますか?

101
alfred_j_kwack

Rsyncがファイルを比較する方法はいくつかあります-信頼できるソースはrsyncアルゴリズムの説明です: https://www.andrew.cmu.edu/course/15-749/READINGS/required/cas/tridgell96.pdf 。 rsyncの wikipediaの記事 も非常に優れています。

ローカルファイルの場合、rsyncはメタデータを比較し、ソースと宛先の間でサイズとタイムスタンプが一致するため、ファイルをコピーする必要がないように見える場合、それ以上は調べません。一致しない場合は、ファイルがcpです。ただし、メタデータは一致するが、ファイルが実際には同じではない場合はどうなりますか?それからrsyncはおそらくあなたが意図したことをしなかった。

同じサイズのファイルはまだ変更されている可能性があります。 1つの簡単な例は、「teh」を「the」に変更するなど、タイプミスを修正するテキストファイルです。ファイルサイズは同じですが、修正されたファイルのタイムスタンプが新しくなります。 --size-onlyは「時刻を確認しないでください。サイズが一致する場合、ファイルが一致すると仮定します」と表示されますが、この場合は間違った選択になります。

一方、昨日誤って大きな "cp -r A B"を実行したが、タイムスタンプを保持するのを忘れたため、逆の "rsync B A"で操作を実行したいとします。昨日実際に変更されていなくても、cpしたすべてのファイルには昨日のタイムスタンプがあり、rsyncはデフォルトですべてのファイルをコピーし、タイムスタンプを昨日に更新します。この場合、-size-onlyが友達になる可能性があります(上記の例をモジュロします)。

--ignore-timesは、ファイルの修正時間が同じかどうかに関係なく、ファイルを比較するように指示します。上記のタイプミスの例を考えてみますが、タイプミスを修正しただけでなく、「タッチ」を使用して、修正したファイルに元のファイルと同じ修正時間を設定しました。 --ignore-timesはファイルの差分を作成しますにもかかわらずサイズと時間は一致します。

101
ckg

Rsyncはチェックサムによってファイルを比較することもできません。

--size-onlyは、タイムスタンプが異なっていても、サイズが一致するファイルをrsyncがスキップすることを意味します。これは、デフォルトの動作よりも少ないファイルを同期することを意味します。全体的なファイルサイズに影響しない変更を含むファイルは失われます。ファイルを変更せずにファイルの日付を変更するものがあり、それらのファイルが変更されていないことを発見するためにrsyncがそれらのファイルのチェックサムに多くの時間を費やしたくない場合、これを使用するオプションです。

--ignore-timesは、タイムスタンプとファイルサイズが一致する場合でも、rsyncがすべてのファイルをチェックサムすることを意味します。これは、デフォルトの動作よりも多くのファイルを同期することを意味します。ファイルサイズが同じで、変更日時が元の値にリセットされている場合でも、ファイルへの変更が含まれます。すべてのファイルをチェックサムすると、ディスクから完全に読み取る必要があるため、時間がかかる場合があります。一部のビルドパイプラインは、タイムスタンプを特定の日付(1970-01-01など)にリセットして、最終ビルドファイルがビットごとに再現可能であることを保証します。タイムスタンプを保存するtarファイルにパックされる場合。

46
rjmunro

簡単な答えは、--ignore-timesはその名前が示す以上のことを行うということです。 both時間とサイズを無視します。対照的に、--size-onlyは、まさにそれが言うことをします。


長い答えは、rsyncにはファイルが古いかどうかを判断する3つの方法があるということです。

  1. ソースと宛先のサイズを比較します。
  2. 送信元と宛先のタイムスタンプを比較します。
  3. 送信元と宛先の静的チェックサムを比較します。

これらのチェックは、データを転送する前に実行されます。特に、これは、静的チェックサムがストリームチェックサムとは異なることを意味します。後者はデータの転送中に計算されます。

デフォルトでは、rsyncは1と2のみを使用します。1と2は両方とも1つのstatで一緒に取得できますが、3はファイル全体を読み取る必要があります(転送用のファイルの読み取りとは無関係です)。修飾子が1つだけ指定されていると仮定すると、次のことを意味します。

  • --size-onlyを使用すると、1つだけが実行されます-タイムスタンプとチェックサムは無視されます。サイズが両端で同じでない限り、ファイルはコピーされます。

  • --ignore-timesを使用すると、1、2、3のいずれも実行されません。ファイルは常にコピーされます。

  • --checksumを使用すると、3はadditionで1に使用されますが、2はnotで実行されます。サイズとチェックサムが一致しない限り、ファイルがコピーされます。チェックサムは、サイズが一致する場合にのみ計算されます。

38
MisterMiyagi

Scientific Linux 6.7システムでは、rsyncのマニュアルページに次のように記載されています。

--ignore-times          don't skip files that match size and time

内容が同じで作成日が異なる2つのファイルがあります。

[root@windstorm ~]# ls -ls /tmp/master/usercron /tmp/new/usercron
4 -rwxrwx--- 1 root root 1595 Feb 15 03:45 /tmp/master/usercron
4 -rwxrwx--- 1 root root 1595 Feb 16 04:52 /tmp/new/usercron

[root@windstorm ~]# diff /tmp/master/usercron /tmp/new/usercron
[root@windstorm ~]# md5sum /tmp/master/usercron /tmp/new/usercron
368165347b09204ce25e2fa0f61f3bbd  /tmp/master/usercron
368165347b09204ce25e2fa0f61f3bbd  /tmp/new/usercron

--size-onlyを使用すると、2つのファイルは同じと見なされます。

[root@windstorm ~]# rsync -v --size-only -n  /tmp/new/usercron /tmp/master/usercron

sent 29 bytes  received 12 bytes  82.00 bytes/sec
total size is 1595  speedup is 38.90 (DRY RUN)

--ignore-timesを使用すると、2つのファイルは異なると見なされます。

[root@windstorm ~]# rsync -v --ignore-times -n  /tmp/new/usercron /tmp/master/usercron
usercron

sent 32 bytes  received 15 bytes  94.00 bytes/sec
total size is 1595  speedup is 33.94 (DRY RUN)

したがって、--ignore-timesはまったく効果がありません。

1
Peter Chiu