2つのオプションの違いを理解しようとしています。
rsync --size-only
そして
rsync --ignore-times
デフォルトでは、rsyncはタイムスタンプとファイルサイズの両方を比較して、ファイルを同期するかどうかを決定することを理解しています。上記のオプションにより、ユーザーはこの動作に影響を与えることができます。
両方のオプションは、少なくとも口頭では同じ結果になると思われます:サイズのみで比較。
ここに微妙な何かが欠けていますか?
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はファイルの差分を作成しますにもかかわらずサイズと時間は一致します。
Rsyncはチェックサムによってファイルを比較することもできません。
--size-only
は、タイムスタンプが異なっていても、サイズが一致するファイルをrsyncがスキップすることを意味します。これは、デフォルトの動作よりも少ないファイルを同期することを意味します。全体的なファイルサイズに影響しない変更を含むファイルは失われます。ファイルを変更せずにファイルの日付を変更するものがあり、それらのファイルが変更されていないことを発見するためにrsyncがそれらのファイルのチェックサムに多くの時間を費やしたくない場合、これを使用するオプションです。
--ignore-times
は、タイムスタンプとファイルサイズが一致する場合でも、rsyncがすべてのファイルをチェックサムすることを意味します。これは、デフォルトの動作よりも多くのファイルを同期することを意味します。ファイルサイズが同じで、変更日時が元の値にリセットされている場合でも、ファイルへの変更が含まれます。すべてのファイルをチェックサムすると、ディスクから完全に読み取る必要があるため、時間がかかる場合があります。一部のビルドパイプラインは、タイムスタンプを特定の日付(1970-01-01など)にリセットして、最終ビルドファイルがビットごとに再現可能であることを保証します。タイムスタンプを保存するtarファイルにパックされる場合。
簡単な答えは、--ignore-times
はその名前が示す以上のことを行うということです。 both時間とサイズを無視します。対照的に、--size-only
は、まさにそれが言うことをします。
長い答えは、rsync
にはファイルが古いかどうかを判断する3つの方法があるということです。
これらのチェックは、データを転送する前に実行されます。特に、これは、静的チェックサムがストリームチェックサムとは異なることを意味します。後者はデータの転送中に計算されます。
デフォルトでは、rsync
は1と2のみを使用します。1と2は両方とも1つのstat
で一緒に取得できますが、3はファイル全体を読み取る必要があります(転送用のファイルの読み取りとは無関係です)。修飾子が1つだけ指定されていると仮定すると、次のことを意味します。
--size-only
を使用すると、1つだけが実行されます-タイムスタンプとチェックサムは無視されます。サイズが両端で同じでない限り、ファイルはコピーされます。
--ignore-times
を使用すると、1、2、3のいずれも実行されません。ファイルは常にコピーされます。
--checksum
を使用すると、3はadditionで1に使用されますが、2はnotで実行されます。サイズとチェックサムが一致しない限り、ファイルがコピーされます。チェックサムは、サイズが一致する場合にのみ計算されます。
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
はまったく効果がありません。