2つのオプションの違いを理解しようとしています
rsync --size-only
そして
rsync --ignore-times
デフォルトでは、rsyncはタイムスタンプとファイルサイズの両方を比較して、ファイルを同期する必要があるかどうかを判断することを理解しています。上記のオプションにより、ユーザーはこの動作に影響を与えることができます。
両方のオプションは、少なくとも言葉で同じ結果をもたらすようです:サイズのみで比較します。
私はここで微妙な何かを見逃していますか?
2つのオプションの違いを理解しようとしています
rsync --size-only
そして
rsync --ignore-times
デフォルトでは、rsyncはタイムスタンプとファイルサイズの両方を比較して、ファイルを同期する必要があるかどうかを判断することを理解しています。上記のオプションにより、ユーザーはこの動作に影響を与えることができます。
両方のオプションは、少なくとも言葉で同じ結果をもたらすようです:サイズのみで比較します。
私はここで微妙な何かを見逃していますか?
回答:
rsyncがファイルを比較する方法はいくつかあります-信頼できるソースはrsyncアルゴリズムの説明です:https : //www.andrew.cmu.edu/course/15-749/READINGS/required/cas/tridgell96.pdf。Wikipediaの記事 rsyncの上にも非常に良いです。
ローカルファイルの場合、rsyncはメタデータを比較し、サイズとタイムスタンプがソースと宛先の間で一致するため、ファイルをコピーする必要がないように見える場合、それ以上は調べません。それらが一致しない場合、それはファイルのcpです。ただし、メタデータは一致するがファイルが実際には同じでない場合はどうなりますか?次に、rsyncはおそらく意図したとおりに実行しませんでした。
同じサイズのファイルがまだ変更されている可能性があります。簡単な例の1つは、「teh」を「the」に変更するなど、タイプミスを修正するテキストファイルです。ファイルサイズは同じですが、修正されたファイルのタイムスタンプは新しいものになります。--size-only「そのとき見ないでください。サイズが一致する場合、ファイルが一致すると仮定します」と言っていますが、この場合は間違った選択になります。
一方、cp -r A B昨日誤って大きな操作を行ったが、タイムスタンプを保存するのを忘れて、今度は逆の操作を実行したいとしますrsync B A。昨日実際に変更されていなくても、cpしたすべてのファイルに昨日のタイムスタンプが付けられます。デフォルトで、rsyncはそれらのすべてのファイルをコピーし、タイムスタンプを昨日にも更新します。--size-onlyこの場合、あなたの友達かもしれません(上記の例を法として)。
--ignore-timesファイルの変更時刻が同じかどうかに関係なく、ファイルを比較するように指示します。上記のタイプミスの例を考えてみてください。タイプミスを修正しただけでなくtouch、修正されたファイルに元のファイルと同じ修正時間を与えるために使用していました-そのように卑劣だとしましょう。まあ--ignore-times、ファイルの差分を行いますにもかかわらず、サイズおよび時刻一致。
簡単に言え--ignore-timesば、その名前が意味する以上のことを行います。時間とサイズの両方を無視します。対照的に、それ--size-onlyはまさにそれが言うことをします。
長い答えはrsync、ファイルが古いかどうかを判断する3つの方法があるということです。
これらのチェックは、データを転送する前に実行されます。特に、これは静的チェックサムがストリームチェックサムとは異なることを意味します。後者はデータの転送中に計算されます。
デフォルトでrsyncは、1と2のみを使用します。1と2の両方を1つのstatで一緒に取得できますが、3はファイル全体を読み取る必要があります(これは転送用のファイルの読み取りとは無関係です)。修飾子が1つだけ指定されているとすると、次のことを意味します。
を使用すると--size-only、1つだけが実行されます。タイムスタンプとチェックサムは無視されます。サイズが両端で同じでない限り、ファイルはコピーされます。
を使用すると--ignore-times、1、2、3のいずれも実行されません。ファイルは常にコピーされます。
を使用すると--checksum、1 に加えて3が使用されますが、2は実行されません。サイズとチェックサムが一致しない限り、ファイルがコピーされます。チェックサムは、サイズが一致する場合にのみ計算されます。
rsyncがファイルをチェックサムで比較できることもありません。
--size-onlyつまり、タイムスタンプが異なっていても、rsyncはサイズが一致するファイルをスキップします。これは、デフォルトの動作よりも少ないファイルを同期することを意味します。全体のファイルサイズに影響を与えない変更のあるファイルはすべて失われます。ファイルを変更せずにファイルの日付を変更する何かがあり、rsyncが多くの時間を費やしてそれらのファイルが変更されていないことを確認するためにそれらのファイルをチェックサムしたくない場合は、これが使用するオプションです。
--ignore-timesタイムスタンプとファイルサイズが一致していても、rsyncがすべてのファイルのチェックサムを行うことを意味します。つまり、デフォルトの動作よりも多くのファイルが同期されます。ファイルサイズが同じで、変更日時が元の値にリセットされている場合でも、ファイルへの変更が含まれます。すべてのファイルをチェックサムすることは、それをディスクから完全に読み取る必要があることを意味し、遅い場合があります。一部のビルドパイプラインは、タイムスタンプを特定の日付(1970-01-01など)にリセットして、タイムスタンプを保存するtarファイルにパックした場合など、最終的なビルドファイルを少しずつ再現できるようにします。
Scientific Linux 6.7システムでは、rsyncのmanページに次のように書かれています。
--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、まったく効果がないように見えます。
--ignore-timesタイムスタンプが同じであってもファイルをコピーします。