ฉันมีโฟลเดอร์ที่มีไฟล์จำนวนมากและ "rm -rf" ใช้เวลานานมากในการทำให้เสร็จ มีวิธีใดที่เร็วกว่าในการลบไดเรกทอรีและเนื้อหา (ส่วนย่อย ฯลฯ )?
ฉันมีโฟลเดอร์ที่มีไฟล์จำนวนมากและ "rm -rf" ใช้เวลานานมากในการทำให้เสร็จ มีวิธีใดที่เร็วกว่าในการลบไดเรกทอรีและเนื้อหา (ส่วนย่อย ฯลฯ )?
คำตอบ:
คุณสามารถลองยกเลิกการเชื่อมโยง 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
ข้อผิดพลาด) ดังนั้นจึงไม่สามารถใช้ตัวเลือกแรกได้
mv
ไอเอ็นจีระหว่างระบบไฟล์ที่แตกต่างกัน / พาร์ทิชันหมายถึงตามมาด้วยcp
rm
/tmp
อยู่ในระบบไฟล์เดียวกันฉันสงสัยว่าmv
และการรีสตาร์ทจะเร็วขึ้นหรือไม่ ฉันไม่แน่ใจว่า/tmp
จะล้างการใช้งานrm
หรือไม่
บางครั้งจะเร็วกว่าfind $DIR_TO_DELETE -type f -delete
rm -rf
mkdir /tmp/empty && rsync -r --delete /tmp/empty/ $DIR_TO_DELETE
นอกจากนี้คุณยังอาจต้องการที่จะลอง
สุดท้ายหากคุณจำเป็นต้องลบเนื้อหาของพาร์ทิชันทั้งที่เร็วที่สุดอาจจะเป็นumount
, และอีกครั้งmkfs
mount
type -f
เพื่อแสดงไฟล์และไม่ใช่ไดเรกทอรีใช่หรือไม่ รวม-print
ถึงการเพิ่มแสดงไฟล์ที่ถูกลบ
หากคุณไม่ต้องการพื้นที่ว่างวิธีที่เร็วที่สุดคือชะลอการลบและทำในพื้นหลัง:
จากนั้นให้ crontab ที่ทำในแบ็คกราวน์ในเวลาเงียบ ๆ โดยมี I / O ที่ต่ำ:
3 3 * * * root ionice -c 3 nice find /path/to/.delete_me -maxdepth 1 ! -name \. -exec echo rm -rf "{}" +
หมายเหตุ:
อัปเดต: ฉันพบกลอุบายในการรันหลาย 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
find target_dir -maxdepth 3 -depth -type d -print0 | xargs -0 -P 5 rm -rf
แทนการที่คำสั่งสุดท้ายใช้ -depth
ตัวเลือกที่จะบอกfind
กับเด็กรายการแรก
ฉันคิดว่าปัญหาคือไม่มีวิธีที่สมบูรณ์แบบในการลบไดเรกทอรีที่มีขนาดใหญ่มากและเนื้อหาทั้งหมดโดยไม่ต้องมีระบบการจัดทำดัชนีที่แท้จริงที่เข้าใจการยกเลิกการเชื่อมโยงและไม่ได้หมายความว่ามันคิดว่าไฟล์นั้นขาดหายไป จะต้องมีความไว้วางใจ
เช่นฉันมี zoneminder กำลังวิ่งเพื่อตีกอล์ฟ ฉันสร้างการโจมตีด้วยลินุกซ์ 1.5 TB เพื่อจัดการข้อมูลจำนวนมหาศาลที่เธอจับได้ต่อวัน (ฟีดกล้อง 12 ตัว) วิธีที่เธอวิ่งบนไดรฟ์ 120 GB นั้นเกินกว่าฉัน เรื่องสั้นสั้น ๆ โฟลเดอร์สำหรับข้อมูลที่บันทึกไว้ทั้งหมดมีขนาดประมาณ 1.4 TB ของที่เก็บข้อมูลของเธอ จำนวนมากเพื่อล้าง
การติดตั้ง ZM ใหม่และกำจัดไลบรารี่เก่า 1.4 TB นั้นไม่ใช่เรื่องสนุกเพราะอาจใช้เวลา 1 - 2 วันในการลบภาพเก่า
FS ที่มีการจัดทำดัชนีอย่างแท้จริงช่วยให้การลดลงของไดเรกทอรีและรู้ว่าข้อมูลที่อยู่ภายใต้มันจะตายและการเป็นศูนย์ข้อมูลจะเสียเวลาและทรัพยากรพีซีของเรา ควรเป็นตัวเลือกในการลบข้อมูลที่ไม่ถูกต้อง RM ใช้เวลานานในโลกแห่งความเป็นจริงใน ext4
คำตอบ: การยกเลิกการเชื่อมโยงไฟล์ทั้งหมดซ้ำ ๆ จะเร็วขึ้นเล็กน้อย แต่คุณยังต้องตั้งเวลาในการรัน FSCK
สร้างสคริปต์ที่รันคำสั่ง "FOR" แบบเรียกซ้ำที่สามารถ "ยกเลิกการเชื่อมโยง" ไฟล์ทั้งหมดภายใต้โฟลเดอร์ของคุณจากนั้นเพียงแค่ rm หรือ rmdir ทุกโฟลเดอร์เพื่อล้างมัน เรียกใช้ FSCK ด้วยตนเองเพื่อเป็นศูนย์ข้อมูลที่เหลือเมื่อสะดวก ค่อนข้างขี้เกียจไม่เขียนมันขอโทษ :)
แม้ว่าจะไม่มีประโยชน์หากคุณต้องการกำจัดไดเรกทอรีที่มีอยู่ฉันจะพูดถึงกลยุทธ์ที่เป็นไปได้หากคุณรู้ว่าคุณจะมีไดเรกทอรีที่มีไฟล์จำนวนมากซึ่งคุณจะต้องทำการล้างอย่างสม่ำเสมอคือการวางไดเรกทอรีไว้ในระบบไฟล์ของตัวเองเช่นพาร์ติชัน) จากนั้นเมื่อคุณต้องการล้างข้อมูลให้ยกเลิกการต่อเชื่อมเรียกใช้mkfs
และติดตั้งใหม่ ตัวอย่างเช่นOpenBSD แนะนำให้ทำเช่นนี้/usr/obj
โดยที่ไฟล์จำนวนมากถูกสร้างขึ้นในระหว่างการ build ของระบบและต้องถูกลบก่อนที่บิลด์ถัดไป