วิธีลบโฟลเดอร์ที่มีขนาดใหญ่อย่างไม่น่าเชื่อใน Linux


1

เรามีโฟลเดอร์แคชซึ่งมีขนาดใหญ่พอที่จะทำลายเซิร์ฟเวอร์โดยไม่ได้ตั้งใจ เรามี RAM 8 GB บนเซิร์ฟเวอร์และเมื่อฉันใช้งานง่าย rm คำสั่งเพื่อลบไฟล์ทั้งหมดที่อยู่ในนั้นใช้ RAM ทั้งหมดและยังคงไม่ลบหลังจาก 5 ชั่วโมง

ดังนั้นเราจึงพยายามใช้ find แต่มันก็ล้มเหลวเช่นกันหลังจากผ่านไป 12 ชั่วโมง ขณะนี้จาก 24 ชั่วโมงล่าสุด find กับ perl คำสั่งกำลังทำงานและโฟลเดอร์ยังไม่ถูกลบอันที่จริงไม่ใช่ไฟล์เดียวที่ถูกลบ

เมื่อเรา ls โฟลเดอร์หลักจะแสดงขนาดโฟลเดอร์โดยรอบ 1GBฉันแค่สงสัยว่ามีกี่ล้านไฟล์มี

ดังนั้นคำถามของฉันมีวิธีใดบ้างที่เราสามารถลบไฟล์โดยไม่แสดงรายการดังนั้นเพียงแค่ลบโฟลเดอร์หรือไฟล์ภายในโดยไม่ทำรายการ (aka ไม่โทร getdir() เช่นการเรียกระบบ)

ฉันกำลังพิจารณาที่จะฟอร์แมตเซิร์ฟเวอร์เพื่อกำจัดมันในตอนนี้

แก้ไข:

ฉันได้ใช้ find กับ -delete และด้วย -exec rm -f {}

EDIT2:

ขึ้นอยู่กับ บทความนี้ เรากำลังเรียกใช้คำสั่ง perl ในขณะนี้ (ดีประมาณ 24+ ชั่วโมงคำสั่งนั้นยังคงทำงานอยู่) แต่ไม่มีอะไรทำในขนาดโฟลเดอร์ที่เราเห็น


Ops ฉันกำลังโพสต์หน้าเดียวกัน :-) คำถามและข้อสังเกตบางอย่าง: filesistem คืออะไร (ต่อ?) พร้อมตัวเลือกใดติดตั้งอยู่บ้าง เซิร์ฟเวอร์ขึ้นหรือไม่ คุณพยายามย้ายไดเรกทอรี (เปลี่ยนชื่อ) และสร้างมันใหม่ (แม้ในระบบไฟล์อื่น)? หากระบบไม่ทำงานสิ่งนี้ควรหลีกเลี่ยงปัญหาคอขวดเนื่องจากการร้องขอให้เขียนหรือแก้ไขไฟล์ใหม่และการรับส่งข้อมูลบนดิสก์ หากเซิร์ฟเวอร์นั้นถูกใช้งานด้วย nice -n 18 (หรืออะไรก็ตาม) ก่อนที่คุณจะสามารถลดคำขอ CPU โปรดทราบว่าในหนึ่งในความคิดเห็นที่ระบุไว้ rm -rf directory/ มันยังทำงานได้เร็วขึ้นสำหรับไฟล์หลายพันล้านไฟล์ในโฟลเดอร์เดียว ...
Hastur

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

@Hastur เราได้รับการเปลี่ยนชื่อโฟลเดอร์และสร้างโฟลเดอร์ว่างใหม่เพื่อหลีกเลี่ยงการเขียนหรือดัดแปลงใหม่ เรามี plesk และโฮสต์เว็บไซต์และฐานข้อมูลให้เรา
Sumit Gupta

ระบบอัพและใช่การฟอร์แมตจริงหมายถึงการทิ้งเซิร์ฟเวอร์นี้และโอนไฟล์ทั้งหมดไปยังเครื่องอื่น (ซึ่งเป็นตัวเลือกสุดท้ายที่เรามี) เราไม่สามารถออฟไลน์ระบบได้ เราเรียกใช้คำสั่งทั้งหมดในบทความนั้นให้มากที่สุดของพวกเขาประมาณ 4-5 ชั่วโมง แต่ไม่มีอะไรสัมผัสไฟล์เหล่านั้น ดังนั้นเราจึงยึดคำสั่งของ perl เพื่อรอและดูว่ามันทำอะไร 24 ชั่วโมงผ่านไป 36 ชั่วโมงและคำสั่งนั้นก็ยังทำอะไรอยู่เบื้องหลัง
Sumit Gupta

มีไฟล์ temp กี่ไฟล์ที่ถูกสร้างในไดเรกทอรีใหม่ใน 24 ชั่วโมงนั้น จากนี้คุณสามารถมีความคิดเกี่ยวกับการร้องขอการเข้าถึงไดเรกทอรีเก่าโดยไม่ต้องขอระบบ หากคุณย้าย (ในระบบไฟล์เดียวกัน) หรือลบไฟล์ที่มีจุดจับยังคงเปิดอยู่ ไฟล์ยังคงสามารถใช้งานได้ . การทำแคช dir บน FS / ดิสก์ใหม่จะลดคำขอที่ส่งไปยังเก่า สำหรับการวางแผนในอนาคตของโครงสร้างที่ซ้อนกันของไดเรกทอรีแคชนี้คุณอาจสนใจอ่าน คำตอบนี้ จาก Gilles
Hastur

คำตอบ:


2

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

find . -type f -print -delete (คุณสามารถลบได้ -print หากคุณไม่ต้องการผลลัพธ์และแน่นอน cd ไปยังโฟลเดอร์ของคุณหรือป้อนชื่อโฟลเดอร์ที่ถูกต้อง)

ลองอย่างน้อยก็คุ้มค่า

แก้ไข - นี่คือข้อเสนอแนะจากคำถามอื่น ๆ เกี่ยวกับ @ ยูนิกซ์

mkdir empty_dir
rsync -a --delete empty_dir/    yourdirectory/

ดีฉันลองที่ตามคำตอบ stackoverflow อื่น ๆ แต่อีกครั้งเพื่อพิมพ์มีรายการผ่านไฟล์ไดเรกทอรีและจึงไม่คุ้มค่า
Sumit Gupta

@SumitGupta เพิ่มคำแนะนำอื่น - คุณสามารถลองใช้คำสั่ง find ได้โดยไม่ต้อง -printมันเป็นทางเลือกถ้าคุณไม่รังเกียจที่จะไม่เห็นความคืบหน้า
Jonno

1

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


วิธีหนึ่งที่ทำงานกับเราได้คือการลบโครงสร้างโฟลเดอร์ด้านบนแล้วเปลี่ยนโครงสร้าง ...
Solar Mike

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