Pertanyaan Bagaimana cara saya membuat rsync menghapus file yang telah dihapus dari folder sumber?
Saya baru-baru ini membuat mesin dengan Ubuntu Server untuk meng-host server game. Saya menginstal plugin cadangan untuk setiap server game yang sering membuat cadangan file dunia game di folder tertentu pada mesin. Saya juga mendirikan sebuah
cron
tugas untuk secara otomatis menyalin cadangan tersebut ke folder Dropbox saya setiap malam menggunakan rsync dengan -a
pilihan.
Setelah beberapa bulan, akun Dropbox saya mencapai batas penyimpanannya dan saya menyadari bahwa saya tidak akan dapat menyimpan begitu banyak cadangan, jadi saya mengonfigurasi plugin cadangan server game untuk tidak menyimpan begitu banyak cadangan, lalu menunggu beberapa hari untuk melihat apakah itu akan hapus cadangan lama seperti yang dijadwalkan dilakukan setiap minggu. Plugin cadangan akhirnya melakukan tugasnya dan menghapus cadangan lama, jadi saya mengharapkan
rsync
tugas cron untuk menghapus cadangan lama dari folder Dropbox saya untuk mencocokkan folder sumber, tetapi belum melakukannya. Jadi saya punya beberapa pertanyaan:- Secara default, tidak
rsync
hanya menambahkan file ke folder tujuan yang telah ditambahkan ke folder sumber dan perubahan file itu telah diubah dalam folder sumber tetapi BUKAN menghapus file yang dihapus dari folder sumber? - Jika itu masalahnya, apa cara terbaik untuk membuatnya
rsync
melakukan hal ini? saya ingin folder tujuan memantulkan folder sumber dengan sempurna, dan itu berarti menghapus semua file yang telah dihapus dari sumbernya map.
Saya melihat beberapa opsi yang tercantum di halaman manual untuk
rsync
yang mungkin melakukan trik, tapi karena saya tidak terbiasa.
128
2018-06-03 03:53
asal
Jawaban:
Untuk menghapus file dalam target, tambahkan
--delete
pilihan untuk perintah Anda. Sebagai contoh:rsync -avh source/ dest/ --delete
146
2017-08-26 07:14
Mungkin menggunakan -aqr sebaliknya juga akan menjadi ide :) - TheBicentennialMan
Pastikan sumbernya adalah direktori. Menggunakan source/* dest/ tidak akan berfungsi. - Tom Saleeba
Saya menemukan acara itu dengan --delete atau --delete-after itu tidak akan menghapus karena beberapa kesalahan: "IO error encounter - skipping file deletion". Untuk mengatasi ini tambahkan --ignore-errors opsi dan debug kesalahan secara terpisah - MHT
Bekerja dengan sempurna! Meskipun bekerja, saya akan merekomendasikan untuk SELALU menggunakannya -n, --dry-run pilihan, sebelum menjalankan rsync, khususnya ketika datang ke opsi seperti ini (--delete). Ini akan menghindari kemungkinan sakit kepala :). - ivanleoncz
@MHT: Sepertinya tidak ada jawaban yang lengkap tanpa komentar Anda. - Lonnie Best
Itu rsync perintah tidak akan menghapus file apa pun saat Anda menggunakan beberapa opsinya
delete
dalam perintah itu. Jadi jika ada file atau folder yang ditambahkan di sumber, itu akan disinkronkan ke target tanpa penghapusan.
Saya menyarankan Anda untuk menggunakannya
rsync
untuk membuat cadangan dari file sumber dan penggunaan find ... rm
untuk file penghapusan untuk jangka waktu atau ukuran file:rsync [options] SOURCE TARGET
find TARGET -maxdepth 1 -type f -mtime +60 -exec rm -f {} \;
Blok kode di atas, membuat cadangan dari sumber dan kemudian menghapus setiap file yang terakhir kali diubah lebih dari 2 bulan.
MEMPERBARUI
Seperti yang saya temukan bahwa
delete
pilihan hanya untuk TARGET bahwa jika beberapa file dihapus dari sumber, rsync --delete
menghapusnya dari TARGET. Dan itu delete
opsi oleh after
dan before
, seperti yang disebutkan di halaman manualnya:--delete-before receiver deletes before transfer, not during
Maksudnya:
- rsync menghapus file dari TARGET yang dihapus dari SOURCE.
- rsync mulai menyinkronkan file.
--delete-after receiver deletes after transfer, not during
Maksudnya:
- rsync mulai menyinkronkan file.
- rsync menghapus file dari TARGET yang dihapus dari SOURCE setelah menyinkronkan.
CATATAN: the
--delete-{before/after}
terapkan hanya di TARGET.
32
2018-06-03 04:13
Terima kasih balasannya!! Apakah Anda mengacu pada opsi "hapus" untuk rsync? Mengapa saya tidak bisa menggunakan opsi "hapus" untuk rsync? - user254251
@ user254251, Jika Anda menggunakan delete, perintah rsync segera menghapus file. Namun dalam hal ini ada lebih banyak waktu untuk kesalahan apa pun. - shgnInc
Jika saya mengerti dengan benar, Anda mengatakan saya harus memisahkan tugas penghapusan dari tugas rsync untuk menghindari kesalahan. Saya punya pertanyaan. Halaman manual untuk rsync mencantumkan beberapa opsi yang tampaknya melayani tujuan memisahkan tugas penghapusan dengan menjalankannya sebelum atau setelah tugas penyalinan. Sebagai contoh, saya melihat dua opsi yang disebut --delete-before dan --delete-after. Apakah rsync dengan opsi-opsi ini memiliki efek yang sama dengan metode yang Anda gambarkan? Saya membaca deskripsi lengkap setiap opsi pada halaman buku panduan tetapi ada beberapa informasi dalam deskripsi yang saya tidak mengerti. - user254251
@ user254251, Jawaban telah diperbarui. Saya tidak tahu apakah ada cara untuk menghapus file dari TARGET berdasarkan batasan waktu rsync. - shgnInc
Terima kasih! Jadi, menurut Anda saya aman dari kesalahan jika saya hanya menggunakan opsi --delete-before? Saya tidak menentukan batas waktu sehingga saya tidak perlu khawatir jika tahap penghapusan rsync menunda tahap transfer. rsync berjalan satu kali per hari dan itu adalah banyak waktu untuk menyinkronkan file cadangan sebelum sinkronisasi berikutnya, jadi saya tidak perlu membatasi waktu sinkronisasi juga. - user254251
Perintah ini akan menyalin data tambahan dan menjaganya tetap sinkron dengan server jarak jauh.
- Ini hanya akan menyalin data inkremental.
- Ini akan menghapus jika ada data yang dihapus dari sumber.
- Ini akan menyalin lagi dari sumber jika ada data yang dihapus di tempat tujuan.
- pada dasarnya perintah ini akan menjaga kedua lingkungan tetap sinkron.
rsync -avWe ssh --delete-before (source) root@localhost:(destination) rsync -avW --delete-before -e ssh (source) root@localhost:(destination)
Contoh:
rsync -avWe ssh --delete-before /data root@192.168.254.254:/backup
rsync -avW --delete-before -e ssh /data root@192.168.254.254:/backup