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


114

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

rsync --size-only

そして

rsync --ignore-times

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

両方のオプションは、少なくとも言葉で同じ結果をもたらすようです:サイズのみで比較します

私はここで微妙な何かを見逃していますか?


18
これは、コードの記述に直接関連するものではなく、既存の(プログラミングに関連しない)ツールを使用するためのものであるため、おそらくSuperUser.comUnix.SEなどに適しています。
Jerry Coffin

回答:


110

rsyncがファイルを比較する方法はいくつかあります-信頼できるソースはrsyncアルゴリズムの説明です:https : //www.andrew.cmu.edu/course/15-749/READINGS/required/cas/tridgell96.pdfWikipediaの記事 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、ファイルの差分を行いますにもかかわらず、サイズおよび時刻一致。


58

簡単に言え--ignore-timesば、その名前が意味する以上のことを行います。時間とサイズの両方を無視します。対照的に、それ--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、1 に加えて3が使用されますが、2は実行されません。サイズとチェックサムが一致しない限り、ファイルがコピーされます。チェックサムは、サイズが一致する場合にのみ計算されます。


1
--checksumはまさに私が探していたものです。ほとんどのファイルの時間のみが変更されたビルド出力をコピーしていました。--checksumを追加すると、時間差は無視されますが、少しずつ同じになるようになりました。それは私が期待したものでした-無視する時間ですので、追加情報をありがとうございます。
ジョセフコノリー

50

rsyncがファイルをチェックサムで比較できることもありません。

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

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


4
「日付/時刻のリセットは実際には行われそうにありませんが、発生する可能性があります」-たとえば、再現可能なビルドの名前で、すべてのファイルを日付ではなく1970-01-01に強制的にリセットするソフトウェアを使用する場合実際の作成/変更の時間。

10
実際、チェックサムを使用したい場合は-cオプションが必要だと思います。これがないと、--ignore-timesはすべてのファイルを無条件にコピーします。
エドワードフォーク2017年

1
-aオプションは、これらのオプションをオーバーライドする場合があります。私の場合、--compare-dir =と--size-onlyを使用していて、予期しない結果が発生しました。-aを-rに変更すると、問題が解決しました。
dbagnara 2017年

@dbagnara私は今日--size-onlyが "上に座っている" -a、または "上書き" -aであることを確認しました。なんらかの理由で、すべての変更時間でマウントされたドライブが1か月増えました。バックアップへのRsyncは、すべてのファイルをコピーしていました(-a ONを使用)。--size-onlyを追加すると問題が修正され、目的の結果が得られました(-a --size-only)。したがって、サイズのみのオーバーライドアーカイブであると結論付けます。
トミー

1

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、まったく効果がないように見えます。


2
--ignore-timesタイムスタンプが同じであってもファイルをコピーします。
MisterMiyagi 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.