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?
Jawaban:
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-only
mengatakan "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 B
kemarin, tetapi Anda lupa menyimpan stempel waktu, dan sekarang Anda ingin melakukan operasi secara terbalikrsync 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-only
mungkin teman anda dalam hal ini (contoh modulo diatas).--ignore-times
mengatakan 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 jugatouch
membuat file yang dikoreksi memiliki waktu modifikasi yang sama dengan file asli - anggap saja Anda licik seperti itu. Kami--ignore-times
akan melakukan diff file meskipun ukuran dan waktu cocok.sumber
Jawaban singkatnya adalah itu
--ignore-times
melakukan lebih dari yang tersirat namanya. Mengabaikan baik waktu dan ukuran. Sebaliknya,--size-only
melakukan persis seperti yang dikatakannya.Jawaban panjangnya adalah
rsync
memiliki tiga cara untuk memutuskan apakah suatu file sudah usang:Pemeriksaan ini dilakukan sebelum mentransfer data. Khususnya, ini berarti checksum statis berbeda dari checksum aliran - yang kemudian dihitung saat mentransfer data.
Secara default,
rsync
hanya menggunakan 1 dan 2. Baik 1 dan 2 dapat diperoleh bersama-sama oleh satustat
, 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.sumber
Anda kehilangan bahwa rsync juga dapat membandingkan file dengan checksum.
--size-only
artinya 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-times
artinya 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.sumber
Pada sistem Scientific Linux 6.7, halaman manual di rsync mengatakan:
Saya memiliki dua file dengan konten yang identik, tetapi dengan tanggal pembuatan yang berbeda:
Dengan
--size-only
, kedua file tersebut dianggap sama:Dengan
--ignore-times
, kedua file tersebut dianggap berbeda:Jadi sepertinya tidak
--ignore-times
ada efeknya sama sekali.sumber
--ignore-times
akan menyalin file meskipun stempel waktunya sama.