Saat menjalankan perintah ini:
$ sudo rsync -r --delete --force --checksum --exclude=uploads /data/prep/* /data/app/
Saya mendapatkan output berikut:
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor
cannot delete non-empty directory: html/js/ckeditor/_source/plugins
cannot delete non-empty directory: html/js/ckeditor/_source/plugins
cannot delete non-empty directory: html/js/ckeditor/_source
cannot delete non-empty directory: html/js/ckeditor/_samples
cannot delete non-empty directory: html/js/ckeditor/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/plugins/uicolor
Dari membaca man rsync
itu kesan saya bahwa --force
opsi akan memberitahu rsync untuk menghapus direktori tidak kosong ini, yang merupakan hasil yang diinginkan.
Ref:
--force force deletion of dirs even if not empty
Bagaimana saya bisa memodifikasi perintah untuk menghapus direktori yang tidak kosong?
Saya menggunakan rsync versi 3.0.8, pada rilis Gentoo Base System 2.0.3, jika itu relevan.
Pembaruan: Ditambahkan sudo
ke perintah untuk memperjelas bahwa ini bukan masalah izin file.
ext3
. Mungkin filesystem tersebut membutuhkan atau diperbaiki. Saya akanfsck
pada kesempatan berikutnya dan memperbarui dengan hasil.fsck
sistem dan masalah ini masih ada.Jawaban:
Apakah Anda mencoba menambahkan
--delete-excluded
?Jika Anda menghapus direktori di folder yang dikecualikan di sisi "remote",
rsync --delete
tidak akan menghapus folder yang dikecualikan di situs "lokal" Anda.sumber
uploads
dihtml/js/ckeditor/_source/plugins/uicolor/yui
,html/js/ckeditor/_samples
danhtml/js/ckeditor/plugins/uicolor/yui
direktori. Terima kasih atas bantuan Anda.--delete-excluded
tetapi Anda masih ingin mengecualikan file / direktori tertentu dari penghapusan, Anda dapat memasukkan file / direktori ini--filter 'protect some_dir/'
, misalnya:rsync -ac --delete --delete-excluded --exclude '*.html' --filter 'protect .git/' . /target/destination/
Berikut adalah beberapa sumber masalah ini:
(1) Kesalahan ini bisa merupakan hasil dari opsi -b (--backup). Opsi ini akan membuat cadangan dari setiap file yang dihapus, dengan menambahkan tilde ( ~ ) pada nama file-nya. (Ini membingungkan saya, karena nama file jelas cadangan, tetapi nama direktori tidak, karena Anda tidak dapat melihat tilde.)
Untuk memeriksa apakah ini kasus yang sama, baca direktori target Anda pada level terdalam, dan periksa apakah ada file akhir tilde (~). Perhatikan bahwa tilde-append-files-names ini kemudian tidak terlihat di beberapa sistem penelusuran file umum, jadi Anda mungkin tidak melihatnya.
Untuk mengatasi kasus ini, pilih opsi --backup-dir = DIR, misalnya --backup-dir = .rsync_bak.
(2) Opsi --exclude dapat memiliki hasil yang sama. Yang mungkin terjadi dalam kasus Anda. Sistem polanya kuat, tetapi mungkin menyesatkan. Sebagai contoh jika Anda menulis --exclude = '* ~', ini akan melewati semua file akhir tilde, menghasilkan persis seperti dalam kasus (1) di atas.
dari halaman manual rsync:
Jika Anda menulis --exclude = unggahan, ini akan mengecualikan semua file bernama "updloads", di tingkat mana pun dari pohon file Anda.
Periksa apakah ada file bernama "unggahan" di dalam direktori Anda yang tidak dapat dihapus.
Solusi adalah mengubah "--exclude = unggah" ke "--exclude = unggah /"
sumber
Dalam pengaturan saya ((sumber adalah Ubuntu format type ext4 untuk menargetkan Western Digital type fuseblk) ia bekerja dengan:
sumber
Gunakan aturan dalam file filter bukan
--exclude
. Ini memungkinkan Anda untuk menandai dikecualikan sebagai "persihable", yang akan memungkinkan Anda menghapus direktori tidak kosong yang berisi file yang dikecualikan.Lihat jawaban ini untuk detailnya.
sumber
Direktori harus kosong agar Anda dapat menghapusnya, sistem file biasanya mensyaratkan itu.
Oleh karena itu biasanya
rsync
ataurm
akan menghapus semua konten secara rekursif terlebih dahulu dan hanya kemudian menghapus direktori sekarang-kosong.Jika pengguna saat ini bukan pemilik semua file, izin sistem file tidak akan memungkinkan Anda untuk menghapus file-file itu. Karena mereka tidak akan dihapus, direktori tidak dikosongkan dan penghapusannya akan gagal.
Dugaan pertama saya adalah bahwa beberapa file dalam direktori tersebut dimiliki oleh pengguna lain misalnya apache atau tidak ada pengguna.
sumber
ls -la
untuk melihat mengapa direktori masih tidak kosong.lsattr
akan menampilkan file yang tidak dapat diubah.lsattr
dari salah satu direktori yang tercantum, keluaran berikut:--------------- ./assets
(no i flag), dan file tersebut tidak berada pada nfs mount. Adakah alasan lain yang bisa Anda pikirkan mengapa perintah itu masih gagal dengan sudo?