rsync 'tidak dapat menghapus kesalahan direktori yang tidak kosong', bahkan dengan opsi --force

28

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 rsyncitu kesan saya bahwa --forceopsi 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 sudoke perintah untuk memperjelas bahwa ini bukan masalah izin file.

tommarshall
sumber
Sistem file apa tujuannya? Apakah sistem file perlu diperbaiki?
Marcus Downing
Sistem file adalah ext3. Mungkin filesystem tersebut membutuhkan atau diperbaiki. Saya akan fsckpada kesempatan berikutnya dan memperbarui dengan hasil.
tommarshall
Saya baru saja fscksistem dan masalah ini masih ada.
tommarshall

Jawaban:

39

Apakah Anda mencoba menambahkan --delete-excluded?

Jika Anda menghapus direktori di folder yang dikecualikan di sisi "remote", rsync --deletetidak akan menghapus folder yang dikecualikan di situs "lokal" Anda.

Martin Höger
sumber
Ada folder bernama uploadsdi html/js/ckeditor/_source/plugins/uicolor/yui, html/js/ckeditor/_samplesdan html/js/ckeditor/plugins/uicolor/yuidirektori. Terima kasih atas bantuan Anda.
tommarshall
jika menggunakan --delete-excludedtetapi 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/
alexandre1985
6

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 pola dimulai dengan a / maka ia berlabuh ke tempat tertentu dalam hierarki file, jika tidak maka cocok dengan akhir pathname

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 /"

pengguna3586623
sumber
0

Dalam pengaturan saya ((sumber adalah Ubuntu format type ext4 untuk menargetkan Western Digital type fuseblk) ia bekerja dengan:

rsync -a -v --progress --modify-window=1 -c -b -i -s -m --del -vv --ignore-errors --chmod=ugo=rwx --delete --delete-excluded  --exclude='*~'  --exclude='.*' --backup-dir=.rsync_bak /home/test /media/user/usbHDD
Dalam hukum
sumber
2
Bagian mana dari ini yang benar-benar menyelesaikan masalah?
Michael Hampton
0

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.

mivk
sumber
-1

Direktori harus kosong agar Anda dapat menghapusnya, sistem file biasanya mensyaratkan itu.

Oleh karena itu biasanya rsyncatau rmakan 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.

HBruijn
sumber
Terima kasih. File dalam direktori memang dimiliki oleh pengguna dalam grup apache, namun saya baru saja mencoba menjalankan perintah ini sebagai pengguna itu dan mendapatkan kesalahan yang sama.
tommarshall
Juga, jika itu adalah masalah izin file, saya berharap menjalankan perintah yang sama dengan 'sudo' untuk menyelesaikan masalah, tetapi ini tidak terjadi. Namun, tolong perbaiki saya jika ini salah.
tommarshall
1
Menjalankan perintah sebagai root harus mengatasi sebagian besar masalah izin, ya. (kemungkinan tempat di mana yang masih akan gagal adalah pada nfs mount untuk menamai satu, file yang tidak dapat diubah lainnya) Pemeriksaan sederhana dengan ls -launtuk melihat mengapa direktori masih tidak kosong. lsattrakan menampilkan file yang tidak dapat diubah.
HBruijn
Terima kasih atas info tambahannya, namun lsattrdari 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?
tommarshall
Apakah ada symlink di sana, atau hanya file nyata?
Marcus Downing