rsync 'ไม่สามารถลบข้อผิดพลาดของไดเรกทอรีที่ไม่ว่างเปล่าแม้จะมีตัวเลือก - บังคับ


28

เมื่อรันคำสั่งนี้:

$ sudo rsync -r --delete --force --checksum --exclude=uploads /data/prep/* /data/app/

ฉันได้รับผลลัพธ์ต่อไปนี้:

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

จากการอ่านman rsyncมันเป็นความประทับใจของฉันที่--forceตัวเลือกจะบอก rsync ให้ลบไดเรกทอรีที่ไม่ว่างเปล่าซึ่งเป็นผลลัพธ์ที่ต้องการ

Ref:

--force                 force deletion of dirs even if not empty

ฉันจะแก้ไขคำสั่งเพื่อลบไดเรกทอรีที่ไม่ว่างได้อย่างไร

ฉันกำลังใช้ rsync เวอร์ชัน 3.0.8 บน Gentoo Base System รีลีส 2.0.3 ในกรณีที่มีความเกี่ยวข้อง

อัปเดต:เพิ่มsudoไปยังคำสั่งเพื่อให้ชัดเจนว่านี่ไม่ใช่ปัญหาการอนุญาตไฟล์


ปลายทางของระบบไฟล์คืออะไร? ระบบไฟล์ต้องการการซ่อมแซมหรือไม่
Marcus Downing

ext3ระบบไฟล์ อาจเป็นไปได้ว่าระบบไฟล์อาจต้องการหรือซ่อมแซม ฉันจะfsckเป็นโอกาสต่อไปและอัปเดตพร้อมผลลัพธ์
tommarshall

ฉันเพิ่งจะfsckใช้ระบบและปัญหานี้ยังคงมีอยู่
tommarshall

คำตอบ:


39

คุณลองเพิ่ม--delete-excludedไหม

หากคุณลบไดเรกทอรีในโฟลเดอร์ที่ยกเว้นของคุณในด้าน "ระยะไกล" rsync --deleteจะไม่ลบโฟลเดอร์ที่ถูกแยกออกจากไซต์ "ท้องถิ่น" ของคุณ


มีโฟลเดอร์ที่เรียกว่าเป็นuploadsในhtml/js/ckeditor/_source/plugins/uicolor/yui, html/js/ckeditor/_samplesและhtml/js/ckeditor/plugins/uicolor/yuiไดเรกทอรี ขอบคุณสำหรับความช่วยเหลือของคุณ.
tommarshall

หากใช้--delete-excludedแต่คุณยังต้องการแยกไฟล์ / ไดเรกทอรีบางส่วนออกจากการลบคุณสามารถใส่ไฟล์ / ไดเรกทอรีนี้ใน--filter 'protect some_dir/'ตัวอย่าง:rsync -ac --delete --delete-excluded --exclude '*.html' --filter 'protect .git/' . /target/destination/
alexandre1985

6

นี่คือสาเหตุที่เป็นไปได้ของปัญหานี้:

(1)ข้อผิดพลาดนี้อาจเป็นผลลัพธ์ของตัวเลือก-b (--backup) ตัวเลือกนี้จะสร้างการสำรองข้อมูลของไฟล์ที่ถูกลบแต่ละไฟล์โดยต่อท้ายตัวหนอน ( ~ ) ในชื่อไฟล์ (สิ่งนี้ทำให้ฉันสับสนเนื่องจากชื่อไฟล์เป็นข้อมูลสำรองอย่างชัดเจน แต่ชื่อไดเรกทอรีไม่ได้เนื่องจากคุณไม่เห็นเครื่องหมายตัวหนอน)

หากต้องการตรวจสอบว่าเป็นกรณีเดียวกันให้อ่านไดเรกทอรีเป้าหมายของคุณในระดับที่ลึกที่สุดและตรวจสอบว่ามีไฟล์สิ้นสุดตัวหนอน (~) ใด ๆ หรือไม่ โปรดทราบว่า tilde-appended-files-names เหล่านี้จะมองไม่เห็นในระบบการเรียกดูไฟล์ทั่วไปดังนั้นคุณอาจไม่เห็น

หากต้องการแก้ปัญหากรณีนี้ให้เลือกตัวเลือก --backup-dir = DIR เช่น --backup-dir = .rsync_bak

(2)ตัวเลือก - ยกเว้นสามารถมีผลลัพธ์เหมือนกัน ซึ่งอาจเกิดขึ้นในกรณีของคุณ ระบบรูปแบบมีประสิทธิภาพ แต่อาจทำให้เข้าใจผิด ตัวอย่างเช่นหากคุณเขียน --exclude = '* ~' สิ่งนี้จะข้ามไฟล์สิ้นสุดตัวหนอนทั้งหมดซึ่งจะเหมือนกับในกรณี (1) ด้านบน

จากหน้า rsync:

หากรูปแบบเริ่มต้นด้วย / แล้วมันจะยึดกับจุดเฉพาะในลำดับชั้นของไฟล์มิฉะนั้นจะจับคู่กับจุดสิ้นสุดของชื่อพา ธ

ถ้าคุณเขียน --exclude = อัพโหลดนี่จะเป็นการยกเว้นไฟล์ทั้งหมดที่ชื่อ "updloads" ที่ระดับใด ๆของแผนผังไฟล์ของคุณ

ตรวจสอบว่ามีไฟล์ชื่อ "อัพโหลด" อยู่ในไดเรกทอรีที่ไม่สามารถลบได้หรือไม่

โซลูชันจะเปลี่ยน "--exclude = uploads" เป็น "--exclude = uploads /"


0

ในการตั้งค่าของฉัน ((แหล่งที่มาคือรูปแบบ Ubuntu ext4 เพื่อกำหนดเป้าหมายฟิวส์ดิจิตอลประเภทตะวันตก) มันทำงานร่วมกับ:

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

2
ส่วนใดของสิ่งนี้ที่แก้ปัญหาได้จริง?
Michael Hampton

0

--excludeกฎการใช้งานในไฟล์กรองแทน สิ่งเหล่านี้ช่วยให้คุณสามารถทำเครื่องหมายแยกเป็น "persihable" ซึ่งจะช่วยให้คุณลบไดเรกทอรีที่ไม่ว่างซึ่งมีไฟล์ที่ถูกแยกออก

ดูคำตอบนี้สำหรับรายละเอียด


-1

ไดเรกทอรีจะต้องว่างเปล่าเพื่อให้คุณลบออกโดยปกติระบบไฟล์จะต้องใช้สิ่งนั้น

ดังนั้นโดยปกติrsyncหรือrmจะลบเนื้อหาทั้งหมดซ้ำก่อนแล้วจึงลบไดเรกทอรีว่างเปล่าทันที

หากผู้ใช้ปัจจุบันไม่ใช่เจ้าของไฟล์ทั้งหมดการอนุญาตระบบไฟล์จะไม่อนุญาตให้คุณลบไฟล์เหล่านั้น เนื่องจากจะไม่ถูกลบออกไดเรกทอรีจะไม่ถูกลบและการลบจะล้มเหลว

การเดาครั้งแรกของฉันคือไฟล์บางไฟล์ในไดเรกทอรีนั้นเป็นของผู้ใช้รายอื่นเช่น apache หรือไม่มีผู้ใช้


ขอบคุณ ไฟล์ภายในไดเรกทอรีนั้นเป็นของผู้ใช้จริงภายในกลุ่ม apache แต่ฉันเพิ่งพยายามเรียกใช้คำสั่งนี้ในฐานะผู้ใช้นั้นและได้รับข้อผิดพลาดเดียวกัน
tommarshall

นอกจากนี้หากเป็นปัญหาการอนุญาตให้ใช้ไฟล์ฉันคาดว่าจะใช้คำสั่งเดียวกับ 'sudo' เพื่อแก้ไขปัญหา แต่นี่ไม่ใช่กรณี อย่างไรก็ตามโปรดแก้ไขให้ฉันถ้าฉันเข้าใจผิด
tommarshall

1
การรันคำสั่งในฐานะรูทควรเอาชนะปัญหาการอนุญาตส่วนใหญ่ใช่ (สถานที่ที่น่าจะยังคงล้มเหลวอยู่บนเมาท์ nfs เพื่อตั้งชื่อไฟล์ที่ไม่เปลี่ยนรูปอีกอัน) ตรวจสอบง่าย ๆls -laเพื่อดูสาเหตุที่ไดเรกทอรียังไม่ว่างเปล่า lsattrจะแสดงไฟล์ที่ไม่เปลี่ยนรูป
HBruijn

ขอบคุณสำหรับข้อมูลเพิ่มเติมอย่างไรก็ตามlsattrจากหนึ่งในไดเรกทอรีที่แสดงรายการเอาท์พุทต่อไปนี้: --------------- ./assets(ไม่มี i flag) และไฟล์ไม่ได้อยู่บนเมาท์ nfs มีเหตุผลอื่นอีกไหมที่คุณคิดว่าทำไมคำสั่งยังคงล้มเหลวด้วย sudo?
tommarshall

มี symlink อยู่ในนั้นหรือเพียงแค่ไฟล์จริง?
Marcus Downing
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.