Bagaimana cara saya menghapus file rsync yang telah dihapus dari folder sumber?


194

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 crontugas untuk secara otomatis menyalin cadangan itu ke folder Dropbox saya setiap malam menggunakan rsync dengan -aopsi.

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 rsynctugas 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 rsynchanya 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 rsyncmelakukannya? 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 rsyncitu mungkin melakukan trik, tetapi karena saya tidak terbiasa.

Jawaban:


227

Untuk menghapus file di target, tambahkan --deleteopsi ke perintah Anda. Sebagai contoh:

rsync -avh source/ dest/ --delete

15
Pastikan sumbernya adalah direktori. Menggunakan source/* dest/tidak akan berhasil.
Tom Saleeba

3
Saya menemukan acara itu dengan --deleteatau --delete-aftertidak akan dihapus karena beberapa kesalahan: "IO erroremui - melewatkan penghapusan file". Untuk mengatasi --ignore-errorsopsi tambah ini dan debug kesalahan secara terpisah
MHT

12
Bekerja dengan sempurna! Meskipun berfungsi, saya akan merekomendasikan untuk SELALU menggunakan -n, --dry-runopsi, sebelum menjalankan rsync, khususnya ketika datang ke opsi seperti ini ( --delete). Ini akan menghindari kemungkinan sakit kepala :).
ivanleoncz

2
@MHT: Sepertinya tidak ada jawaban yang lengkap tanpa komentar Anda.
Lonnie Best

2
@TheBicentennialMan -a menyiratkan -r .
x-yuri

45

The rsync perintah wont menghapus file apapun saat Anda menggunakan beberapa pilihan yang deletedi perintah itu. Jadi, jika ada file atau folder yang ditambahkan dalam sumber, itu akan disinkronkan ke target tanpa penghapusan.

Saya menyarankan Anda untuk menggunakan rsyncuntuk membuat cadangan dari file sumber dan gunakan find ... rmuntuk menghapus file untuk periode waktu atau ukuran file:

rsync [options] SOURCE TARGET
find TARGET -maxdepth 1 -type f -mtime +60 -exec rm -f {} \;

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 deleteopsi hanya untuk TARGET bahwa jika beberapa file dihapus dari sumber, rsync --deletehapus dari TARGET. Dan deleteopsi oleh afterdan before, sebagaimana disebutkan dalam halaman manualnya:

--delete-before         receiver deletes before transfer, not during

Maksudnya:

  1. rsync menghapus file dari TARGET yang dihapus dari SOURCE.
  2. rsync mulai menyinkronkan file.

--delete-after receiver deletes after transfer, not during

Maksudnya:

  1. rsync mulai menyinkronkan file.
  2. rsync menghapus file dari TARGET yang dihapus dari SOURCE setelah sinkronisasi.

CATATAN : --delete-{before/after}implement hanya di TARGET.


1
Terima kasih balasannya!! Apakah Anda merujuk ke opsi "hapus" untuk rsync? Mengapa saya tidak bisa menggunakan opsi "delete" untuk rsync?
user254251

@ user254251, Jika Anda menggunakan delete, perintah rsync segera menghapus file. Tetapi dalam hal ini ada lebih banyak waktu untuk kesalahan.
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 muncul untuk melayani tujuan memisahkan tugas penghapusan dengan menjalankannya sebelum atau setelah tugas penyalinan. Sebagai contoh, saya melihat dua opsi bernama --delete-before dan --delete-after. Apakah rsync dengan opsi-opsi ini memiliki efek yang sama dengan metode yang Anda jelaskan? Saya membaca deskripsi lengkap dari setiap opsi pada halaman manual tetapi ada beberapa informasi dalam deskripsi yang tidak saya mengerti.
user254251

@ user254251, Jawaban telah diperbarui. Saya tidak tahu apakah ada cara untuk menghapus file dari TARGET dengan batasan waktu di rsync .
shgnInc

Terima kasih! Jadi menurut Anda saya aman dari kesalahan jika saya cukup menggunakan opsi --delete-before? Saya tidak menentukan batas waktu jadi saya tidak perlu khawatir jika tahap penghapusan rsync menunda tahap transfer. rsync berjalan sekali per hari dan itu banyak waktu untuk menyinkronkan file cadangan sebelum sinkronisasi berikutnya, jadi saya tidak perlu membatasi waktu sinkronisasi juga.
user254251

6

Perintah ini akan menyalin data kenaikan dan menyinkronkannya dengan server jauh.

  1. Ini hanya akan menyalin data inkremental.
  2. Ini akan menghapus jika ada data yang dihapus dari sumber.
  3. Ini akan menyalin lagi dari sumber jika ada data yang dihapus di tujuan.
  4. 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

2
Saya pikir -W membuatnya tidak hanya menyalin data inkremental tetapi untuk selalu menyalin seluruh file.
Tulains Córdova

Saya mendapatkan kesalahan ini dengan menjalankan perintah ini: rsync: Failed to exec --delete-before: No such file or directory (2)
Jeff Tian

1

Jika ada kesalahan selama scync rsync, rsync tidak akan benar menghapus file itu harus memiliki, bahkan jika Anda menggunakan --delete, --delete-afteratau --delete-before.

Inilah sebabnya mengapa penting untuk mengatasi kesalahan rsync.

Sebagian besar kesalahan saya adalah karena menggunakan --permsopsi saat menyinkronkan dengan sistem file Non-Linux. Ketika saya diganti --permsdengan --no-perms, kesalahan-kesalahan itu hilang dan kemudian menghapusnya berhasil.

--permsok 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), --permsmenyebabkan 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-permsuntuk menghindari kesalahan-kesalahan yang sabotase --delete, --delete-afteratau --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:

sudo rsync -r --delete --existing --ignore-existing --ignore-errors --progress /path/to/source/ /path/to/destination

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-errorsargumen juga, sehingga akan menghapus bahkan jika ada kesalahan.


1
Terima kasih atas tipnya! Saya adalah penulis asli dari pertanyaan ini 5 tahun yang lalu. Saya sangat senang Anda memposting ini, karena saya telah merencanakan untuk mengatur sinkronisasi ke drive NTFS dalam waktu dekat, dan saya mungkin akan mengalami kesalahan izin karena saya berencana untuk menggunakan opsi "-a" untuk rsync, yang menyinkronkan izin (antara lain). Jadi saya menambahkan "--no-perms" ke catatan saya. Saya sekarang berencana untuk menggunakan rsync -a --no-perms --delete-before. Saya punya pertanyaan: Tidakkan --hapus-sebelum menghindari masalah dengan penghapusan file dengan menjalankan penghapusan sebelum sinkronisasi? Pikir itulah tujuannya.
user254251

@ user254251 - Saya tidak yakin. Saya kira itu akan tergantung pada seberapa awal itu benar-benar "dihapus sebelumnya". Jika beberapa cara menemukan satu kesalahan sebelum penghapusan dimulai, Anda kacau. Saran saya kepada Anda adalah untuk menghindari NTFS kapan saja Anda bisa kecuali Anda suka rasa sakit yang tajam di pantat Anda :). NTFS ke NTFS berfungsi dengan baik. NTFS ke Linix berfungsi dengan baik. Hindari "sistem file Linux" ke "Sistem File Non-Linux"; itu terlalu menyakitkan untuk memastikan penghapusan bekerja dengan benar. Anda BISA mencapai ini, tapi saya memutuskan tidak sepadan dengan hanya memformat drive tujuan sebagai EXT4.
Lonnie Best
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.