มีวิธีที่เร็วกว่าในการลบไดเรกทอรีมากกว่า“ rm -rf” หรือไม่?


32

ฉันมีโฟลเดอร์ที่มีไฟล์จำนวนมากและ "rm -rf" ใช้เวลานานมากในการทำให้เสร็จ มีวิธีใดที่เร็วกว่าในการลบไดเรกทอรีและเนื้อหา (ส่วนย่อย ฯลฯ )?


สำหรับทุกคนที่สนใจดู: slashroot.in/comment/1286#comment-1286หาสำคัญปั้น perl สำคัญ rsync
Rinzwind

คำตอบ:


33

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

rm ดีเท่าที่จะได้รับ


มีบางคนพูดถึงกรณีที่มีบางสิ่งที่เร็วกว่ากรณีอื่น ๆ แต่ขอให้แน่ใจว่าเรากำลังเปรียบเทียบรุ่นที่ดีที่สุดของสิ่งเดียวกัน

หากคุณต้องการลบไดเรกทอรีและทุกสิ่งในนั้นฉันแนะนำให้คุณ:

rm -rf path/to/directory

rmจะภายในรายการไฟล์และไดเรกทอรีมันจะลบ และนั่นคือทั้งหมดในเรียบเรียงC มันคือเหตุผลสองข้อที่เร็วที่สุด

นี่ไม่ใช่สิ่งเดียวrm -rf path/to/directory/*ที่จะขยายในระดับเชลล์และส่งผ่านอาร์กิวเมนต์ที่โหลดเข้าrmมา จากนั้นrmจะต้องแยกวิเคราะห์เหล่านั้นแล้วเรียกคืนจากแต่ละ นั่นช้ากว่ามาก

เช่นเดียวกับ "มาตรฐาน" ที่เปรียบเทียบfind path/to/directory -exec {} \;นั้นไร้สาระ ที่ทำงานrmหนึ่งครั้งต่อไฟล์ที่พบ ช้ามาก. Find สามารถสร้างคำสั่ง build แบบ xargs-style ด้วย-exec rm {} +แต่นั่นก็ช้าเท่ากับการขยายตัว คุณสามารถโทรหา-deleteซึ่งใช้การunlinkโทรภายในไปยังเคอร์เนล (เช่นเดียวกับrm) แต่จะใช้งานได้กับไฟล์ในตอนแรกเท่านั้น

ดังนั้นจะทำซ้ำจนกว่าคุณจะโยนลงในดิสก์หินหนืดร้อนของเหลวเป็นกษัตริย์rm


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

หรือใช้ดิสก์ที่เร็วกว่า หากคุณมี RAM จำนวนมากการใช้/dev/shm(ดิสก์ RAM) อาจเป็นแนวคิด


คุณไม่สามารถใช้การunlinkเรียกของระบบในไดเรกทอรี (คุณจะได้รับEISDIRข้อผิดพลาด) ดังนั้นจึงไม่สามารถใช้ตัวเลือกแรกได้
James Henstridge

mv to / tmp จะเร็วขึ้นไหม ดูเหมือนว่า mv ใช้เวลานานเกินไป
Mohammad Moghimi

@MohammadMoghimi: mvไอเอ็นจีระหว่างระบบไฟล์ที่แตกต่างกัน / พาร์ทิชันหมายถึงตามมาด้วยcp rm
enzotib

3
@enzotib อย่างไรก็ตามหาก/tmpอยู่ในระบบไฟล์เดียวกันฉันสงสัยว่าmvและการรีสตาร์ทจะเร็วขึ้นหรือไม่ ฉันไม่แน่ใจว่า/tmpจะล้างการใช้งานrmหรือไม่
Sparhawk

1
rsyncในกรณีมาตรฐานนี้เร็วกว่าrm -rf: web.archive.org/web/20130929001850/http://linuxnote.net/…
schmijos

11

บางครั้งจะเร็วกว่าfind $DIR_TO_DELETE -type f -deleterm -rf

mkdir /tmp/empty && rsync -r --delete /tmp/empty/ $DIR_TO_DELETEนอกจากนี้คุณยังอาจต้องการที่จะลอง

สุดท้ายหากคุณจำเป็นต้องลบเนื้อหาของพาร์ทิชันทั้งที่เร็วที่สุดอาจจะเป็นumount, และอีกครั้งmkfsmount


1
ไม่ใช่type -fเพื่อแสดงไฟล์และไม่ใช่ไดเรกทอรีใช่หรือไม่ รวม-printถึงการเพิ่มแสดงไฟล์ที่ถูกลบ
leetbacoon

8

หากคุณไม่ต้องการพื้นที่ว่างวิธีที่เร็วที่สุดคือชะลอการลบและทำในพื้นหลัง:

  • mkdir .delete_me
  • mv ไดเรกทอรีใหญ่นั่นฉันอยากไป. delete_me

จากนั้นให้ crontab ที่ทำในแบ็คกราวน์ในเวลาเงียบ ๆ โดยมี I / O ที่ต่ำ:

3 3 * * * root ionice -c 3 nice find /path/to/.delete_me -maxdepth 1 ! -name \. -exec echo rm -rf "{}" +

หมายเหตุ:

  • ตรวจสอบผลลัพธ์ของคุณก่อนที่จะลบเสียงสะท้อนใน crontab!
  • ไดเรกทอรี. delete_me จะต้องอยู่ในระบบไฟล์เดียวกัน - ในกรณีที่ทุกคนไม่ชัดเจน

อัปเดต: ฉันพบกลอุบายในการรันหลาย rm ในแบบคู่ขนาน - สิ่งนี้จะช่วยได้ถ้าคุณมีดิสก์อาร์เรย์ขนาดใหญ่:

ionice -c 3 nice find target_directory -depth -maxdepth 3 | xargs -d \n -P 5 -n 5 rm -rf
  • - ลึกเพื่อทำการสำรวจเส้นทางแรกที่มีความลึก

  • - ความลึกสูงสุดเพื่อจำกัดความลึกของการสำรวจเส้นทางดังนั้นเราจะไม่จบการฟังแต่ละไฟล์

  • -d \ n เพื่อจัดการช่องว่างในชื่อไฟล์

  • -P และ -n จัดการระดับของการขนาน (ตรวจสอบ manpage)

อ้างอิง: http://blog.liw.fi/posts/rm-is-too-slow/#comment-3e028c69183a348ee748d904a7474019

อัปเดต 2 (2018): ด้วย ZFS ที่จัดส่งมาพร้อมกับ Ubuntu 18.04 ฉันใช้สำหรับทุกอย่างและฉันจะสร้างชุดข้อมูลใหม่สำหรับโครงการขนาดใหญ่ หากคุณวางแผนล่วงหน้าและทำสิ่งนี้ล่วงหน้าคุณสามารถ "zfs ทำลาย" ระบบไฟล์เมื่อคุณทำเสร็จแล้ว ;-)

ฉันใช้คำแนะนำจาก wiki zfsonlinux เพื่อติดตั้ง Ubuntu กับ ZFS อย่างเป็นทางการ: https://github.com/zfsonlinux/zfs/wiki/Ubuntu-18.04-Root-on-ZFS


2
find target_dir -maxdepth 3 -depth -type d -print0 | xargs -0 -P 5 rm -rfแทนการที่คำสั่งสุดท้ายใช้ -depthตัวเลือกที่จะบอกfindกับเด็กรายการแรก
muru

2

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

เช่นฉันมี zoneminder กำลังวิ่งเพื่อตีกอล์ฟ ฉันสร้างการโจมตีด้วยลินุกซ์ 1.5 TB เพื่อจัดการข้อมูลจำนวนมหาศาลที่เธอจับได้ต่อวัน (ฟีดกล้อง 12 ตัว) วิธีที่เธอวิ่งบนไดรฟ์ 120 GB นั้นเกินกว่าฉัน เรื่องสั้นสั้น ๆ โฟลเดอร์สำหรับข้อมูลที่บันทึกไว้ทั้งหมดมีขนาดประมาณ 1.4 TB ของที่เก็บข้อมูลของเธอ จำนวนมากเพื่อล้าง

การติดตั้ง ZM ใหม่และกำจัดไลบรารี่เก่า 1.4 TB นั้นไม่ใช่เรื่องสนุกเพราะอาจใช้เวลา 1 - 2 วันในการลบภาพเก่า

FS ที่มีการจัดทำดัชนีอย่างแท้จริงช่วยให้การลดลงของไดเรกทอรีและรู้ว่าข้อมูลที่อยู่ภายใต้มันจะตายและการเป็นศูนย์ข้อมูลจะเสียเวลาและทรัพยากรพีซีของเรา ควรเป็นตัวเลือกในการลบข้อมูลที่ไม่ถูกต้อง RM ใช้เวลานานในโลกแห่งความเป็นจริงใน ext4

คำตอบ: การยกเลิกการเชื่อมโยงไฟล์ทั้งหมดซ้ำ ๆ จะเร็วขึ้นเล็กน้อย แต่คุณยังต้องตั้งเวลาในการรัน FSCK

สร้างสคริปต์ที่รันคำสั่ง "FOR" แบบเรียกซ้ำที่สามารถ "ยกเลิกการเชื่อมโยง" ไฟล์ทั้งหมดภายใต้โฟลเดอร์ของคุณจากนั้นเพียงแค่ rm หรือ rmdir ทุกโฟลเดอร์เพื่อล้างมัน เรียกใช้ FSCK ด้วยตนเองเพื่อเป็นศูนย์ข้อมูลที่เหลือเมื่อสะดวก ค่อนข้างขี้เกียจไม่เขียนมันขอโทษ :)


0

แม้ว่าจะไม่มีประโยชน์หากคุณต้องการกำจัดไดเรกทอรีที่มีอยู่ฉันจะพูดถึงกลยุทธ์ที่เป็นไปได้หากคุณรู้ว่าคุณจะมีไดเรกทอรีที่มีไฟล์จำนวนมากซึ่งคุณจะต้องทำการล้างอย่างสม่ำเสมอคือการวางไดเรกทอรีไว้ในระบบไฟล์ของตัวเองเช่นพาร์ติชัน) จากนั้นเมื่อคุณต้องการล้างข้อมูลให้ยกเลิกการต่อเชื่อมเรียกใช้mkfsและติดตั้งใหม่ ตัวอย่างเช่นOpenBSD แนะนำให้ทำเช่นนี้/usr/objโดยที่ไฟล์จำนวนมากถูกสร้างขึ้นในระหว่างการ build ของระบบและต้องถูกลบก่อนที่บิลด์ถัดไป

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