ลบไดเรกทอรีทางอ้อมภายในตัวเอง


9

ฉันมีไดเรกทอรีอยู่ภายในตัวเอง ฉันจะลบมันได้อย่างไร

~/.local/share/Trash/files$ ls devices/
reg-dummy
~/.local/share/Trash/files$ ls devices/reg-dummy/
subsystem
~/.local/share/Trash/files$ ls devices/reg-dummy/subsystem/
devices

ด้วย

~/.local/share/Trash/files$ find devices/ | head -n 20
devices/
devices/reg-dummy
devices/reg-dummy/subsystem
devices/reg-dummy/subsystem/devices
devices/reg-dummy/subsystem/devices/reg-dummy
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices
devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy/subsystem/devices/reg-dummy

นอกจากนี้แม้ว่าสมองของฉันไม่สามารถแก้ปัญหาการหยุดชะงักได้ แต่ดูเหมือนว่ามันจะsudo rm -rf devicesดำเนินต่อไปตลอดกาลโดยไม่สร้างผลลัพธ์

~/.local/share/Trash/files$ sudo rm -rf devices
^C~/.local/share/Trash/files$

perl -e 'use File::Path qw(remove_tree); remove_tree("$ENV{HOME}/.local/share/Trash/files/devices")'สิ่งเดียวกันสำหรับ du -s devices/สิ่งเดียวกันสำหรับ สิ่งเดียวกันสำหรับdu -sch ~/.local/share/Trash/ คำสั่งอื่น ๆ

$ cd ~/.local/share/Trash/files/devices/reg-dummy/subsystem/devices/
$ ls -ldi 
8131921 drwxr-xr-x 3 theking theking 4096 Mar 17 19:43 .
$ cd reg-dummy/subsystem/devices/
$ ls -dli
8131926 drwxr-xr-x 3 theking theking 4096 Mar 17 19:43 .


$ find .local/share/Trash/files/ -maxdepth 1 -delete
find: cannot delete `.local/share/Trash/files/devices': Directory not empty
find: cannot delete `.local/share/Trash/files/': Directory not empty

ฉันไม่ต้องการให้มันติดอยู่ในถังขยะของฉันตลอดไป!

หมายเหตุ: ฉันกำลังทำการแบ็คอัพข้อมูลดิบของคอมพิวเตอร์โดยใช้เพียงscpแต่ฉันไม่มีพื้นที่เหลือเพียงพอแล้วสิ่งนี้ก็เกิดขึ้น


โปรดแสดงคำสั่งที่คุณพยายามลบด้วยและข้อผิดพลาดที่เกิดขึ้นกับคุณ อะไรrm -rf devicesทำอย่างไร
terdon

โปรดเพิ่มผลลัพธ์ของls -dli devicesและls -dli devices/reg-dummy/subsystem/devices/
terdon

3
คำสั่งแรกควรจะได้รับไม่ได้ls -ldi devices deviceฉันพยายามที่จะดูว่าเหล่านี้เป็นลิงค์ยากจริง ๆ (inode เดียวกัน) อย่างไรก็ตามโปรดทราบว่าหากนี่เป็นไดเรกทอรีขนาดใหญ่rm -rfจะใช้เวลานาน แต่จะใช้งานได้ในที่สุด หากปัญหาที่นี่คือการเชื่อมโยงแบบวงกลมคุณจะได้รับข้อความแสดงข้อผิดพลาดเกี่ยวกับการเรียกซ้ำแบบไม่สิ้นสุด หากไม่มีข้อความแสดงข้อผิดพลาดให้rm -rfเรียกใช้หลักสูตร
terdon

7
@terdon: ฉันคิดว่าลินุกซ์ (อูบุนตูอย่างน้อย) ไม่อนุญาตให้มีไดเรกทอรีที่ลิงก์ยาก
saiarcot895

2
ฉันแค่สมมติว่าคุณลองด้วยปุ่ม "ถังขยะเปล่า" ในตัวใช่ไหม (บางทีพวกเขาอาจนึกถึงสิ่งนั้นเมื่อเขียน nautilus ^^)
MrVaykadji

คำตอบ:


3

ผลลัพธ์ของls -ldiจะแสดงหมายเลขไอโหนดของไดเรกทอรี หากไดเรกทอรีภายในไดเรกทอรีนั้นมีหมายเลขไอโหนดเหมือนกับบรรพบุรุษของมันแทนที่จะเป็นชื่อเดียวกันระบบไฟล์ของคุณจะเสียหายและคุณจะต้องบูตเข้าสู่โหมดช่วยเหลือแล้วทำการบันทึก


1

ฉันยังคิดว่ามันrm -rfจะใช้ได้ผลถ้าคุณให้เวลามากพอ แต่ถ้าไม่ทำอย่างใดอย่างหนึ่งหรือทั้งสองอย่างนี้ควร:

perl -e 'use File::Path qw(remove_tree); 
        remove_tree("$ENV{HOME}/.local/share/Trash/files/devices")'`

 

find .local/share/Trash/files/ -delete

คุณสามารถตรวจสอบให้แน่ใจว่ามีบางอย่างเกิดขึ้นถ้าคุณใช้rm -rfv ~/.local/share/Trash/files/devicesอย่างน้อยก็จะทำให้คุณรู้ว่าไฟล์กำลังถูกลบ

อย่างไรก็ตามนี่ไม่ใช่ปัญหาฮาร์ดลิ้งค์ (แม้จะมีความคิดเห็นที่ไม่ถูกต้องของฉัน) เพราะไดเรกทอรีไม่สามารถ hardlinked ภายใต้ Linux โดยทั่วไปเมื่อคุณมีการเรียกซ้ำแบบไม่สิ้นสุดเช่นเดียวกับที่เกิดขึ้นกับซอฟต์ลิงค์คุณจะได้รับข้อความถึงเอฟเฟกต์นั้นซึ่งจะไม่เกิดขึ้น

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

rm -rf ~/.local/share/Trash/* 

คุณควรลองล้างโฟลเดอร์ถังขยะจาก GUI เพียงเลือกถังขยะและคลิกที่ "ล้างถังขยะ" เพื่อดูว่าใช้ได้หรือไม่


พวกเขาทั้งสองล้มเหลว แก้ไขคำถามแล้ว
PyRulez

@PyRulez ไดเรกทอรีนี้มีขนาดใหญ่แค่ไหน? สคริปต์ perl และrmจะไม่สร้างผลลัพธ์ใด ๆ พวกเขาวิ่งมานานเท่าไหร่? ฉันยังปรับปรุงfindคำสั่งก่อนหน้านี้ผิดด้วย ดูคำตอบที่อัพเดทแล้ว ในที่สุดเราก็ตาบอดที่นี่ โปรดอัปเดตคำถามของคุณด้วยผลลัพธ์ls -lที่คุณเคยใช้lsและแสดงผลลัพธ์du -sch ~/.local/share/Trash/เพื่อให้เราทราบขนาด
terdon

ฉันหาขนาดไม่ได้
PyRulez

@PyRulez ลองdu -sch ~/.local/share/Trash/ที่จะทำให้คุณมีขนาด และโปรดเพิ่มทุกสิ่งที่ความคิดเห็นต่าง ๆ ถามพวกเขาต้องการเพื่อให้เราสามารถเข้าใจสิ่งที่เกิดขึ้น
terdon

@tedron ฉันเคยไป
PyRulez

0

(ฉันมั่นใจว่านี่จะใช้งานได้และขณะที่ฉันกำลังจะเดินทางตอนนี้ฉันจะปล่อยให้นี่เป็นคำตอบที่ฉันสามารถลบได้ในอนาคตหากไม่ได้ทำงาน)

  1. ก่อนอื่นให้เรียกใช้อย่างปลอดภัย

    find ~/.local/share/Trash/files/devices/ -exec echo {} \;
    
  2. ประการที่สองหากผลลัพธ์ของ "1" ไม่แสดงไฟล์สำคัญใด ๆ ให้เรียกใช้

    find ~/.local/share/Trash/files/devices/ -exec rm {} \;
    
  3. ขั้นตอนสุดท้ายจะเป็น

    find ~/.local/share/Trash/files/devices/ -empty -type d -delete
    
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.