Pertanyaan Bagaimana tepatnya rsync memutuskan apa yang harus disinkronkan?


Saya menemukan banyak jawaban atas pertanyaan itu, jadi ingin bertanya kepada orang-orang yang benar-benar menggunakannya, daripada hanya ingin membuat blog terbesar dengan mengisi informasi semi acak yang tidak berguna.

Skenario: I rsync -av --progress /dir/a /dir/b  dan itu melakukan hal itu.

Saya menambahkan file baru ke / dir / a dan menjalankan perintah yang sama lagi, ia tahu apa yang dilakukannya dan hanya menyalin file-file baru.

Saya menambahkan file baru ke / dir / a dan mengganti nama beberapa file di / dir / b, dan mungkin menghapus beberapa juga.

Jika saya jalankan rsync -av --progress /dir/a /dir/b lagi, apa yang akan disalin? Hanya file baru karena ia tahu apa yang telah disalin sebelumnya, atau file yang berganti nama / dihapus juga, karena tidak ada lagi.

Dan sebagai bonus, jika file yang sebelumnya disalin adalah disalin lagi, adakah cara untuk mencegahnya, sehingga hanya tambahan baru pada / dir / a yang disalin?

Saat ini saya senang memeriksa sesuatu secara manual, tetapi karena data semakin besar, saya akan membutuhkan lebih banyak otomatisasi untuk melakukan tugas ini.


12
2017-10-29 13:59


asal


Itu -i Bendera sangat berguna. Untuk setiap file, ini memberikan string pertandingan yang dapat di-decode untuk melihat mengapa cocok (tanda untuk waktu mod, bendera untuk ukuran, dll.) - BowlOfRed


Jawaban:


Saya menambahkan file baru ke / dir / a dan menjalankan perintah yang sama lagi, ia tahu apa yang dilakukannya dan hanya menyalin file-file baru.

Tidak, itu tidak tahu apa yang dilakukannya dalam lari sebelumnya. Ini membandingkan data di sisi penerima dengan data yang akan dikirim. Dengan data yang cukup kecil, ini tidak akan terlihat, tetapi ketika Anda memiliki direktori cukup besar, waktu yang dihabiskan untuk membandingkan sebelum menyalin benar-benar dimulai dengan mudah dirasakan.

Pemeriksaan default untuk waktu dan ukuran modifikasi file. Dari man rsync:

-c, --checksum
      This changes the way rsync checks if the files have been changed
      and  are in need of a transfer.  Without this option, rsync uses
      a "quick check" that (by default) checks if each file’s size and
      time of last modification match between the sender and receiver.
      This option changes this to compare a 128-bit checksum for  each
      file  that  has a matching size.  Generating the checksums means
      that both sides will expend a lot of disk I/O  reading  all  the
      data  in  the  files  in  the transfer (and this is prior to any
      reading that will be done to transfer changed  files),  so  this
      can slow things down significantly.

Dan:

-u, --update
      This  forces  rsync  to  skip  any  files  which  exist  on  the
      destination  and  have  a  modified  time that is newer than the
      source  file.   (If  an  existing   destination   file   has   a
      modification time equal to the source file’s, it will be updated
      if the sizes are different.)

Perhatikan bahwa ini tidak tersirat oleh opsi yang Anda gunakan. -a aku s:

-a, --archive               archive mode; same as -rlptgoD (no -H)
-r, --recursive             recurse into directories
-l, --links                 copy symlinks as symlinks
-p, --perms                 preserve permissions
-o, --owner                 preserve owner (super-user only)
-g, --group                 preserve group
    --devices               preserve device files (super-user only)
    --specials              preserve special files
-D                          same as --devices --specials
-t, --times                 preserve times

16
2017-10-29 14:40



Deskripsi terbaik yang pernah saya lihat (sejauh ini), terima kasih - SPooKYiNeSS
Sedikit tambahan. File berganti nama diperlakukan sebagai file unik di kedua ujungnya. Menentukan --fuzzy sekali akan mengenali mereka sebagai yang sama di direktori yang sama. Menggunakan --fuzzy dua kali memperluas kemampuan ini ke lokasi lain. Lihat man rsync untuk detailnya. Tentu saja, salah satu alasan utama untuk menggunakan rsync adalah kemampuannya untuk menyalin hanya bagian-bagian file yang telah berubah. Ini dapat membuat transfer melalui jaringan lebih cepat. BTW, opsi checksum disebutkan di atas untuk penjelasannya tentang bagaimana rsync bekerja. Dalam banyak kasus, itu tidak boleh digunakan. - Joe


Umum

Jika saya mengerti dengan benar, rsync -av tidak memiliki memori, sehingga akan menyalin file yang diganti namanya / dihapus juga, karena mereka hadir di sumber tetapi tidak ada lagi di target.

Tips

  • Gunakan opsi -n, 'lari kering', untuk memeriksa apa yang terjadi sebelum Anda menjalankannya rsync garis komando.

  • Perhatikan arti khusus dari garis miring di belakang setelah direktori sumber, dan lihat perbedaan antara

    rsync -av --progress dir/a/ dir/b
    

    dan

    rsync -av --progress dir/a dir/b
    

    yang dijelaskan dalam manual man rsync.

Contoh

Kasus khusus Anda (menambahkan file ke direktori sumber 'a' dan menghapus file dari direktori target 'b') akan menambahkan file yang ditambahkan dan file yang disalin sebelumnya, karena masih dalam direktori sumber. Ini akan terjadi baik dengan maupun tanpa opsi -u dan saya tidak tahu opsi apa pun di rsync untuk memperbaikinya dengan mudah, jika Anda ingin menyimpannya di direktori source.

Tetapi Anda dapat menghapusnya dari direktori sumber atau memasukkan nama file ke dalam file excluded dan gunakan opsi --exclude-from=excluded (untuk banyak file) atau sederhananya --exclude=PATTERN untuk satu atau beberapa file.

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-2

sent 103 bytes  received 25 bytes  256.00 bytes/sec
total size is 13  speedup is 0.10 (DRY RUN)

$ rsync -av --progress dir/a/ dir/b
sending incremental file list
./
file-1
              6 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=1/3)
file-2
              7 100%    6.84kB/s    0:00:00 (xfr#2, to-chk=0/3)

sent 196 bytes  received 57 bytes  506.00 bytes/sec
total size is 13  speedup is 0.05

$ echo textx-3>./dir/a/file-3

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-3

sent 121 bytes  received 22 bytes  286.00 bytes/sec
total size is 21  speedup is 0.15 (DRY RUN)

$ rm dir/b/file-1 
rm: ta bort normal fil 'dir/b/file-1'? y

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-3

sent 124 bytes  received 25 bytes  298.00 bytes/sec
total size is 21  speedup is 0.14 (DRY RUN)

$ rsync -avun --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-3

sent 124 bytes  received 25 bytes  298.00 bytes/sec
total size is 21  speedup is 0.14 (DRY RUN)

$ rsync -avun --exclude=file-1 --progress dir/a/ dir/b
sending incremental file list
./
file-3

sent 104 bytes  received 22 bytes  252.00 bytes/sec
total size is 15  speedup is 0.12 (DRY RUN)

Alternatif: unison

Anda mungkin ingin menguji alat ini unison, yang mana sinkronisasi alat. Ini menyediakan metode visual untuk mengidentifikasi kasus-kasus khusus dan memutuskan apa yang harus dilakukan. Ada versi GUI (unison-gtk).


4
2017-10-29 14:57



Contoh bagus terima kasih. Saya tahu / pada akhirnya, saya hanya menanyakan ini dari aplikasi, dan melewatkannya (dan Anda dapat dengan jelas melihat saya hanya menyalin / memposting - SPooKYiNeSS
Dan lagi mengirim sebelum saya selesai dan tidak akan membiarkan saya mengedit komentar saya ... Disalin / disisipkan yang kedua. Saya akan melihat tidak biasa dan melihat apakah itu bisa melakukan apa yang saya inginkan, dan jika tidak saya akan kembali ke rencana b dan hanya membuat skrip - SPooKYiNeSS
Saya telah menggunakan unison-gtk selama beberapa tahun, dan saya senang dengan itu. (Saya menggunakan rsync terlalu.) - sudodus


Ini hanya menyalin file baru di / dir / a. Apa pun yang Anda lakukan di / dir / b akan diabaikan, kecuali Anda menggunakan opsi --delete. Dalam hal ini, nama file dalam / dir / b akan dihapus. Ini akan memaksa / dir / b menjadi persis seperti / dir / a.

Tentang bonus, maksud Anda seperti dalam kasus mengganti nama file di / dir / a, dan kemudian rsyncing ke / dir / b? Saya tidak berpikir ada cara untuk mencegah rsync dari hanya menyalin file lagi dalam kasus itu.


1
2017-10-29 14:24



Saya tidak berharap ada cara, selain menggunakan atribut untuk menentukan, tetapi kemudian jika membuat naskah kiddie dan akan memiliki kebutuhan lagi. Terima kasih atas jawaban Anda, setidaknya saya sekarang tahu apa yang harus saya lakukan. - SPooKYiNeSS