Baru-baru ini saya membuat mesin dengan Ubuntu Server untuk meng-host server game. Saya memasang plugin cadangan untuk setiap server game yang sering membuat cadangan file game dunia dalam folder tertentu di mesin. Saya juga membuat cron
tugas untuk secara otomatis menyalin cadangan itu ke folder Dropbox saya setiap malam menggunakan rsync dengan -a
opsi.
Setelah beberapa bulan akun Dropbox saya mencapai batas penyimpanannya dan saya menyadari bahwa saya tidak akan bisa menyimpan begitu banyak cadangan, jadi saya mengkonfigurasi plugin cadangan server game untuk tidak menyimpan begitu banyak cadangan, lalu menunggu beberapa hari untuk melihat apakah itu akan hapus cadangan yang lebih lama seperti yang dijadwalkan dilakukan setiap minggu. Plugin cadangan akhirnya melakukan tugasnya dan menghapus cadangan yang lebih lama, jadi saya mengharapkan rsync
tugas cron untuk kemudian menghapus cadangan yang lebih lama dari folder Dropbox saya agar sesuai dengan folder sumber, tetapi belum melakukannya. Jadi saya punya beberapa pertanyaan:
Secara default, apakah
rsync
hanya menambahkan file ke folder tujuan yang telah ditambahkan ke folder sumber dan mengubah file yang telah diubah di folder sumber tetapi TIDAK menghapus file yang dihapus dari folder sumber?Jika itu masalahnya, apa cara terbaik untuk
rsync
melakukannya? Saya ingin folder tujuan dengan sempurna mencerminkan folder sumber, dan itu berarti menghapus semua file yang telah dihapus dari folder sumber.
Saya melihat beberapa opsi yang tercantum di halaman manual untuk rsync
itu mungkin melakukan trik, tetapi karena saya tidak terbiasa.
source/* dest/
tidak akan berhasil.--delete
atau--delete-after
tidak akan dihapus karena beberapa kesalahan: "IO erroremui - melewatkan penghapusan file". Untuk mengatasi--ignore-errors
opsi tambah ini dan debug kesalahan secara terpisah-n, --dry-run
opsi, sebelum menjalankanrsync
, khususnya ketika datang ke opsi seperti ini (--delete
). Ini akan menghindari kemungkinan sakit kepala :).-a
menyiratkan-r
.The rsync perintah wont menghapus file apapun saat Anda menggunakan beberapa pilihan yang
delete
di perintah itu. Jadi, jika ada file atau folder yang ditambahkan dalam sumber, itu akan disinkronkan ke target tanpa penghapusan.Saya menyarankan Anda untuk menggunakan
rsync
untuk membuat cadangan dari file sumber dan gunakanfind ... rm
untuk menghapus file untuk periode waktu atau ukuran file:Blok kode di atas, buat cadangan dari sumber lalu hapus setiap file yang waktu modifikasi terakhirnya lebih dari 2 bulan.
MEMPERBARUI
Ketika saya menemukan bahwa
delete
opsi hanya untuk TARGET bahwa jika beberapa file dihapus dari sumber,rsync --delete
hapus dari TARGET. Dandelete
opsi olehafter
danbefore
, sebagaimana disebutkan dalam halaman manualnya:Maksudnya:
--delete-after receiver deletes after transfer, not during
Maksudnya:
CATATAN :
--delete-{before/after}
implement hanya di TARGET.sumber
Perintah ini akan menyalin data kenaikan dan menyinkronkannya dengan server jauh.
rsync -avWe ssh --delete-before (source) root@localhost:(destination) rsync -avW --delete-before -e ssh (source) root@localhost:(destination)
Contoh:
sumber
rsync: Failed to exec --delete-before: No such file or directory (2)
Jika ada kesalahan selama scync rsync, rsync tidak akan benar menghapus file itu harus memiliki, bahkan jika Anda menggunakan
--delete
,--delete-after
atau--delete-before
.Inilah sebabnya mengapa penting untuk mengatasi kesalahan rsync.
Sebagian besar kesalahan saya adalah karena menggunakan
--perms
opsi saat menyinkronkan dengan sistem file Non-Linux. Ketika saya diganti--perms
dengan--no-perms
, kesalahan-kesalahan itu hilang dan kemudian menghapusnya berhasil.--perms
ok ketika Anda menyinkronkan dari sistem file Linux ke sistem file Linux lain, tetapi jika Anda menyinkronkan dari Linux ke sistem file Non-Linux (seperti NTFS, FAT),--perms
menyebabkan kesalahan karena rsync tidak dapat mengatur izin Linux pada sistem file non-linux . Sekali lagi, error = no delete.- Ketika syncing ke partisi Non-Linux, saya menggunakan
--no-perms
untuk menghindari kesalahan-kesalahan yang sabotase--delete
,--delete-after
atau--delete-before
.Jika Anda masih mendapatkan kesalahan setelah itu, dan tidak dapat menemukan cara untuk membuat kesalahan itu berjalan, Anda dapat menjalankan perintah yang khusus didedikasikan untuk menghapus file yang tidak sinkron:
Perintah di atas akan menghapus hal-hal yang tidak sinkron, tetapi tidak akan menyinkronkan file apa pun. Jadi, Anda harus melakukan sinkronisasi lagi setelah ini. Perintah itu didasarkan dari jawaban ini , kecuali bahwa saya menambahkan
--ignore-errors
argumen juga, sehingga akan menghapus bahkan jika ada kesalahan.sumber