rsync: perbedaan antara --size-only dan --ignore-times

114

Saya mencoba memahami apa perbedaan antara dua opsi

rsync --size-only

dan

rsync --ignore-times

Menurut pemahaman saya, secara default rsync akan membandingkan timestamp dan ukuran file untuk memutuskan apakah file harus disinkronkan atau tidak. Opsi di atas memungkinkan pengguna untuk memengaruhi perilaku ini.

Kedua opsi tersebut tampaknya, setidaknya secara verbal menghasilkan hal yang sama: membandingkan hanya berdasarkan ukuran .

Apakah saya melewatkan sesuatu yang halus di sini?

alfred_j_kwack
sumber
18
Ini mungkin akan lebih cocok untuk sesuatu seperti SuperUser.com atau Unix.SE , karena ini tentang menggunakan alat yang ada (yang tidak terkait dengan pemrograman) daripada apa pun yang terkait langsung dengan penulisan kode.
Jerry Coffin

Jawaban:

110

Ada beberapa cara rsync membandingkan file - sumber otoritatifnya adalah deskripsi algoritme rsync: https://www.andrew.cmu.edu/course/15-749/READINGS/required/cas/tridgell96.pdf . The Artikel wikipedia pada rsync juga sangat baik.

Untuk file lokal, rsync membandingkan metadata dan jika sepertinya tidak perlu menyalin file karena ukuran dan stempel waktu cocok antara sumber dan tujuan, itu tidak terlihat lebih jauh. Jika tidak cocok, itu cp filenya. Namun, bagaimana jika metadata memang cocok tetapi file sebenarnya tidak sama? Kemudian rsync mungkin tidak melakukan apa yang Anda inginkan.

File dengan ukuran yang sama mungkin masih berubah. Salah satu contoh sederhana adalah file teks di mana Anda memperbaiki kesalahan ketik - seperti mengubah "teh" menjadi "the". Ukuran file sama, tetapi file yang dikoreksi akan memiliki stempel waktu yang lebih baru. --size-onlymengatakan "jangan lihat waktu; jika ukuran cocok menganggap file cocok", yang akan menjadi pilihan yang salah dalam kasus ini.

Di sisi lain, misalkan Anda tidak sengaja melakukan hal besar cp -r A Bkemarin, tetapi Anda lupa menyimpan stempel waktu, dan sekarang Anda ingin melakukan operasi secara terbalik rsync B A. Semua file yang Anda cp memiliki cap waktu kemarin, meskipun kemarin tidak benar-benar diubah, dan rsync secara default akan menyalin semua file tersebut, dan memperbarui cap waktu ke kemarin juga. --size-onlymungkin teman anda dalam hal ini (contoh modulo diatas).

--ignore-timesmengatakan untuk membandingkan file terlepas dari apakah file memiliki waktu modifikasi yang sama. Pertimbangkan contoh kesalahan ketik di atas, tetapi Anda tidak hanya mengoreksi kesalahan ketik tersebut tetapi juga touchmembuat file yang dikoreksi memiliki waktu modifikasi yang sama dengan file asli - anggap saja Anda licik seperti itu. Kami --ignore-timesakan melakukan diff file meskipun ukuran dan waktu cocok.

ckg
sumber
58

Jawaban singkatnya adalah itu --ignore-timesmelakukan lebih dari yang tersirat namanya. Mengabaikan baik waktu dan ukuran. Sebaliknya, --size-onlymelakukan persis seperti yang dikatakannya.


Jawaban panjangnya adalah rsyncmemiliki tiga cara untuk memutuskan apakah suatu file sudah usang:

  1. Bandingkan ukuran sumber dan tujuan.
  2. Bandingkan stempel waktu sumber dan tujuan.
  3. Bandingkan checksum statis sumber dan tujuan.

Pemeriksaan ini dilakukan sebelum mentransfer data. Khususnya, ini berarti checksum statis berbeda dari checksum aliran - yang kemudian dihitung saat mentransfer data.

Secara default, rsynchanya menggunakan 1 dan 2. Baik 1 dan 2 dapat diperoleh bersama-sama oleh satu stat, sedangkan 3 membutuhkan membaca seluruh file (ini independen dari membaca file untuk transfer). Dengan asumsi hanya satu pengubah yang ditentukan, itu berarti sebagai berikut:

  • Dengan menggunakan --size-only, hanya 1 yang dilakukan - cap waktu dan checksum diabaikan. File disalin kecuali ukurannya identik di kedua ujungnya.

  • Dengan menggunakan --ignore-times, tidak satu pun dari 1, 2 atau 3 dilakukan. File selalu disalin.

  • Dengan menggunakan --checksum, 3 digunakan selain 1, tetapi 2 tidak dilakukan. File disalin kecuali ukuran dan checksum cocok. Checksum hanya dihitung jika ukurannya cocok.

MisterMiyagi
sumber
1
--checksum persis seperti yang saya cari. Saya menyalin keluaran build yang hanya memiliki perubahan waktu untuk sebagian besar file. Menambahkan --checksum berarti mengabaikan perbedaan waktu tetapi memastikan keduanya identik sedikit demi sedikit. Itu yang saya harapkan --lupakan kali untuk melakukannya terima kasih atas info tambahan.
Joseph Connolly
50

Anda kehilangan bahwa rsync juga dapat membandingkan file dengan checksum.

--size-onlyartinya rsync akan melewatkan file yang ukurannya sama, meskipun stempel waktunya berbeda. Ini berarti ini akan menyinkronkan lebih sedikit file daripada perilaku default. Ini akan kehilangan file dengan perubahan yang tidak mempengaruhi ukuran file secara keseluruhan. Jika Anda memiliki sesuatu yang mengubah tanggal pada file tanpa mengubah file, dan Anda tidak ingin rsync menghabiskan banyak waktu memeriksa file-file itu untuk mengetahui bahwa mereka tidak berubah, ini adalah opsi untuk digunakan.

--ignore-timesartinya rsync akan memeriksa setiap file, meskipun stempel waktu dan ukuran file cocok. Ini berarti ini akan menyinkronkan lebih banyak file daripada perilaku default. Ini akan mencakup perubahan pada file meskipun ukuran file sama dan tanggal / waktu modifikasi telah diatur ulang ke nilai aslinya. Checksumming setiap file berarti harus dibaca seluruhnya dari disk, yang mungkin lambat. Beberapa pipeline build akan menyetel ulang stempel waktu ke tanggal tertentu (seperti 1970-01-01) untuk memastikan bahwa file build akhir dapat direproduksi sedikit demi sedikit, misalnya saat dikemas ke dalam file tar yang menyimpan stempel waktu.

rjmunro
sumber
4
"menyetel ulang tanggal / waktu tidak mungkin dilakukan dalam praktik, tetapi bisa saja terjadi" - Misalnya saat menggunakan perangkat lunak yang, atas nama build yang dapat direproduksi, secara paksa menyetel ulang setiap file ke 1970-01-01 alih-alih tanggal dan waktu pembuatan / modifikasi sebenarnya.
10
Sebenarnya, saya pikir Anda memerlukan opsi -c jika Anda ingin checksum digunakan. Tanpanya, --ignore-times akan menyalin semua file tanpa syarat.
Edward Falk
1
Opsi -a dapat menggantikan opsi ini. Dalam kasus saya, saya menggunakan --compare-dir = dan --size-only dan mendapatkan hasil yang tidak diharapkan. Mengubah -a ke -r memecahkan masalah.
dbagnara
@dbagnara Saya mengkonfirmasi hari ini bahwa --size-only "berada di atas" -a, atau "override" -a. Saya memiliki drive yang untuk alasan apa pun dipasang dengan semua waktu modifikasi meningkat sebulan. Rsync ke backup sedang menyalin setiap file (dengan -a ON). Menambahkan --size-only memperbaiki masalah dan memberikan hasil yang diinginkan (jadi -a --size-only). Jadi saya menyimpulkan bahwa arsip penggantian hanya ukuran.
Tommy
1

Pada sistem Scientific Linux 6.7, halaman manual di rsync mengatakan:

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

Saya memiliki dua file dengan konten yang identik, tetapi dengan tanggal pembuatan yang berbeda:

[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

Dengan --size-only, kedua file tersebut dianggap sama:

[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)

Dengan --ignore-times, kedua file tersebut dianggap berbeda:

[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)

Jadi sepertinya tidak --ignore-timesada efeknya sama sekali.

Peter Chiu
sumber
2
--ignore-timesakan menyalin file meskipun stempel waktunya sama.
MisterMiyagi