ฉันมีไดเรกทอรีที่มี ~ 3 ล้านไฟล์ในไดเรกทอรีย่อยบางแห่งบนเซิร์ฟเวอร์ Windows 2008 การลบไฟล์ด้วยตนเองผ่าน SHIFT + DEL บน root dir ใช้เวลานาน มีวิธีอื่นใดที่จะทำการลบอย่างรวดเร็ว ?
ฉันมีไดเรกทอรีที่มี ~ 3 ล้านไฟล์ในไดเรกทอรีย่อยบางแห่งบนเซิร์ฟเวอร์ Windows 2008 การลบไฟล์ด้วยตนเองผ่าน SHIFT + DEL บน root dir ใช้เวลานาน มีวิธีอื่นใดที่จะทำการลบอย่างรวดเร็ว ?
คำตอบ:
คำเตือน: ถ้าคุณมี symlink ไปยังไดเรกทอรีแล้วdel
จะลบไดเรกทอรีจริงไม่ใช่ symlink ระมัดระวังด้วยสิ่งนี้และอย่ารันคำสั่งเหล่านี้จนกว่าคุณจะรู้ว่าไม่มีสัญลักษณ์เชื่อมโยงในไดเรกทอรีเป้าหมาย
ฉันต้องลบไฟล์และไดเรกทอรีจำนวนมากออกจากไดรฟ์เข้ารหัส WinXP โดยทั่วไปจะมีไฟล์ประมาณ 22 GB จาก 500,000 ไฟล์ในโฟลเดอร์ 45,000 โฟลเดอร์
การลบด้วย Windows Explorer นั้นเป็นขยะเพราะเสียเวลามากมายในการระบุไฟล์ ฉันมักจะย้ายสิ่งที่ฉันจำเป็นต้องลบ C: \ stufftodelete และมีไฟล์ deletestuff.bat rmdir /s/q C:\stufftodelete
ชุดไป นี่เป็นกำหนดการวิ่งในตอนกลางคืน แต่บางครั้งฉันก็ต้องวิ่งในตอนกลางวันเพื่อให้เร็วขึ้น
นี่คือผลลัพธ์ของการทดสอบเวลาอย่างรวดเร็วของตัวอย่างขนาดเล็ก 5.85 MB จากไฟล์ 960 ไฟล์ใน 303 โฟลเดอร์ ฉันใช้วิธีที่ 1 ตามด้วยวิธีที่ 2 จากนั้นรีเซ็ตไดเรกทอรีการทดสอบ
วิธีที่ 1 ลบไฟล์และโครงสร้างไดเรกทอรีในหนึ่งรอบ:
rmdir /s/q foldername
วิธีที่ 2 มีการส่งผ่านครั้งแรกเพื่อลบไฟล์และส่งออกไปยัง nul เพื่อหลีกเลี่ยงค่าใช้จ่ายในการเขียนไปยังหน้าจอสำหรับไฟล์ singe ทุกไฟล์ การผ่านครั้งที่สองจากนั้นทำความสะอาดโครงสร้างไดเรกทอรีที่เหลืออยู่:
del /f/s/q foldername > nul
rmdir /s/q foldername
นี่คือผลลัพธ์ของการทดสอบอื่นโดยใช้ 404 MB จาก 19,521 ไฟล์ใน 3,243 โฟลเดอร์:
ดังนั้นจึงมีไม่มากในมันอาจใกล้เกินไปที่จะตัดสินในการทดสอบครั้งเดียว
แก้ไข: ฉันได้ทดสอบซ้ำกับข้อมูลจำนวนมากนี่เป็นกรณีปกติสำหรับฉัน: 28.3 GB จาก 1,159,211 ไฟล์ใน 146,918 โฟลเดอร์:
ว้าววิธีที่ 2 เร็วกว่าวิธีที่ 1 เกือบสามเท่า! ฉันจะอัปเดต deletestuff.bat ของฉัน!
del
จะลบไดเรกทอรีจริงไม่ใช่ symlink ระมัดระวังด้วยสิ่งนี้และอย่ารันคำสั่งเหล่านี้จนกว่าคุณจะรู้ว่าไม่มีสัญลักษณ์เชื่อมโยงในไดเรกทอรีเป้าหมาย
หากคุณต้องลบทรีไดเรกทอรีขนาดใหญ่อย่างสม่ำเสมอให้พิจารณาการจัดเก็บรูทของทรีไดเรกทอรีนั้นในพาร์ติชันแยกต่างหากจากนั้นเพียงฟอร์แมตแบบด่วนทุกครั้งที่คุณต้องการลบทุกอย่าง หากคุณต้องการทำให้สิ่งนี้เป็นแบบอัตโนมัติคุณสามารถใช้คำสั่ง DOS นี้:
echo Y | format Z: /FS:NTFS /X /Q
โดยที่ Z: เป็นพาร์ติชัน 'ระเหย' ของคุณ หมายเหตุ: พาร์ติชันต้องไม่มีป้ายชื่อ ฉัน blogged เกี่ยวกับเรื่องนี้ที่นี่
ในคอมมานด์พรอมต์ (Start -> Run -> cmd
):
del /f /s /q foldername
นอกเหนือจากการคัดลอก / ย้ายไฟล์อย่างรวดเร็ว (โดยใช้ API ของตัวเอง) TeraCopy ยังสามารถลบไฟล์และมันก็เร็วมากเช่นกัน นับตั้งแต่ค้นพบ TeraCopy ฉันจะไม่ใช้คอมพิวเตอร์โดยไม่ได้ติดตั้ง (ถ้าฉันจะคัดลอก / ย้าย / ลบ)
โปรแกรมติดตั้งตัวเดียวกันนั้นติดตั้งรุ่น x64 แต่คุณต้องบังคับด้วยตนเอง
เบต้าที่ฉันแนะนำให้ใช้กับเวอร์ชั่นเสถียร: http://blog.codesector.com/2010/09/22/teracopy-2-2-beta-3/
ฉันทำไฟล์ bat ที่ทำเช่นเดียวกัน
@echo off
echo --------------------WARNING--------------------
echo folder "%~1" will be deleted
echo --------------------WARNING--------------------
pause
echo Deleting folder: "%~1".
time /T
del /f/s/q "%~1" >nul
rmdir /s/q "%~1" >nul
echo Done.
time /T
echo --- Taking ownership.
takeown /f "%~1" /r /d y >nul
icacls "%~1" /reset /t >nul
icacls "%~1" /setowner "%username%" /t >nul
echo Done all.
time /T
มันทำงานในสองขั้นตอนหนึ่งก็พยายามที่จะลบไฟล์ และที่สองคือพยายามที่จะเป็นเจ้าของไฟล์ คุณควรเปลี่ยนแปลงได้ตามท้องถิ่นของคุณ (หมายถึงใช่เป็นภาษาอังกฤษ) หากงานล้มเหลว (เช่นหากล้มเหลวเพราะได้รับอนุญาต) คุณจะต้องเรียกใช้อีกครั้ง อย่างไรก็ตามรอบที่สองจะไม่พยายามลบไฟล์ที่ถูกลบในรอบแรกดังนั้นจึงค่อนข้างรวดเร็ว
วิธีใช้งาน บันทึกเป็น delfolder.bat ในเส้นทางของเส้นทาง (เช่น c: \ windows) จากนั้นเรียกใช้เป็น
delfolder "foldername"
โดยที่ foldername เป็นชื่อของโฟลเดอร์
ในการทดสอบของฉันการลบไฟล์ 123'000 นั้นใช้เวลา 3 นาที (sata 7200rpm) เย้!
%1
สคริปต์ แต่"%~1"
อย่างใด วิธีนี้ถ้าอาร์กิวเมนต์ได้รับการส่งผ่านด้วยคำพูดมันจะถูกยกออกและขอ หากยังไม่ได้ส่งผ่านด้วยเครื่องหมายคำพูดก็จะถูกยกมา
การใช้รหัสด้านล่างมักใช้งานได้ดีสำหรับฉัน
mkdir empty_dir
robocopy empty_dir dir_to_wipe /mir /r:0 /w:0 /e
rmdir empty_dir dir_to_wipe
rsync
ใน Linux มันเร็วขึ้นแล้วrmdir
ใช่ไหม
del /f/q/s
+ rmdir /s/q
มาก หาก dir_to_wipe ของคุณมีอีเมลขยะc:\some_important_dir
คุณจะต้องสูญเสียข้อมูลของคุณ
ใช้คำสั่ง rd / sจากพรอมต์คำสั่ง
ทางออกที่ดีที่สุดน่าจะเป็นการย้ายโฟลเดอร์ออกจากที่ใดที่หนึ่ง (เช่นถังรีไซเคิล) จากนั้นเริ่มลบมัน มันจะใช้เวลานาน แต่อย่างน้อยมันก็จะออกนอกทาง
ฉันค่อนข้างมั่นใจว่าเวลาที่ใช้ในการลบไฟล์ทั้งหมดนั้นเป็นความต้องการโดยธรรมชาติของงานไม่ใช่ความไร้ประสิทธิภาพในการดำเนินการลบ
ติดตั้งCygwinและใช้-r RM แต่นั่นก็น่าจะเกินกำลัง
rd /q /s
...
rm
เร็วกว่า cmd.exe rd
หรือไม่ เนื่องจากการจำลอง cygwin ของอินเทอร์เฟซ posix ค่อนข้างช้าตามที่ต้องการทำงานพิเศษบางอย่างซึ่งrm
ไม่ได้ชื่นชมจริง ๆ
rm -rf
และพยายาม ในเวลาประมาณ 10 นาทีฉันถูกยกเลิกและกลับไปdel /f/s/q
เพราะภายใต้ Cygwin การใช้ดิสก์เพียง 50% ภายใต้del
การใช้ดิสก์ถูกตรึงที่ 100% ดังนั้นฉันคิดว่ามันจะต้องลบได้เร็วขึ้น การใช้ CPU คือ <1% สำหรับทั้งสองวิธี ฉันไม่แน่ใจเกี่ยวกับหมายเลขไฟล์เพราะฉันปิด Windows File Deleter หลังจากใช้เวลาในการคำนวณ 10 นาที
คุณเปิดใช้งานการสร้างชื่อไฟล์สั้น ๆ หรือไม่? ถ้าเป็นเช่นนั้นคุณต้องการมันจริงเหรอ? การลบไฟล์เป็นเพียงเมตาดาต้า opeartion ดังนั้นหากคุณมีจำนวนชื่อที่จะลบสองเท่าจำนวนงานจะสูงขึ้นอย่างมีนัยสำคัญ
คุณลองทั้งสองแอพทั้งสองนี้หรือไม่?
ตรวจสอบให้แน่ใจว่าตั้งค่าจำนวนการเขียนทับเป็น 0 หากคุณต้องการประสิทธิภาพที่เร็วที่สุด ทำได้โดยคลิกตัวเลือกจากนั้นเปลี่ยนค่าที่ด้านล่างของกล่องโต้ตอบ
ป้อนพา ธ ที่จะลบในฟิลด์แหล่งที่มาแล้วคลิกลบ
แอพเหล่านี้ไม่ได้ใส่ไฟล์ลงในถังรีไซเคิล ใช้ด้วยความระมัดระวัง
นี้มีไว้เพื่อชมเชยและเพิ่มขั้นตอนในคำตอบที่กล่าวถึงก่อนหน้านี้
วิธีการสองข้อที่กล่าวมาข้างต้นนั้นค่อนข้างมีประสิทธิภาพ แต่การตรวจสอบประสิทธิภาพนั้นทำได้ยากเว้นแต่ว่าจะถูกเปรียบเทียบกับเงื่อนไขเดียวกัน:
จากนั้นดำเนินการกำหนดค่าผ่าน Batch File และใช้ Powershell Cmdlet เพื่อบันทึกและวัดประสิทธิภาพ
ต่อไปนี้เป็นโฟลเดอร์ตัวอย่างบางส่วน (ตั้งชื่อเป็นขนาดรวม) ที่ฉันทดลอง แต่ไม่สามารถรับผลการทดสอบ / ข้อสรุปใด ๆ ได้
r.bat
rmdir /s/q 3.2G
rd.bat
del /f/s/q 3.3G > nul rmdir /s/q 3.3G
Powershell:
PS S:\T> Measure-Command { S:\T\rd.bat } > rdlog.txt
PS S:\T> Measure-Command { S:\T\r.bat } > rlog.txt
PS S:\T> Measure-Command { S:\T\rd.bat } > rd_1.7G_log.txt
PS S:\T> Measure-Command { S:\T\r.bat } > r_1.8G_log.txt
PS S:\T> Measure-Command { S:\T\r.bat } > r_2.4G_log.txt
PS S:\T> Measure-Command { S:\T\rd.bat } > rd_2.7G_log.txt
PS S:\T> Measure-Command { S:\T\r.bat } > r_3.2G_log.txt
PS S:\T> Measure-Command { S:\T\rd.bat } > rd_3.3G_log.txt
คำตอบจากHugoนั้นเร็วที่สุด แต่ก็ไม่ได้ลบไฟล์ที่ซ่อนอยู่หรือไฟล์ระบบในรอบแรกดังนั้นหากคุณต้องการโซลูชันที่สมบูรณ์ยิ่งขึ้นให้ใช้พารามิเตอร์ / a:
del /f /s /q /a foldername > nul
rmdir /s /q foldername
เกี่ยวกับไฟล์ BAT โดยMagallanesให้ระวังอย่างมากกับ takeown และ icacls ทำให้ hardlinks แชร์สิทธิ์และเจ้าของเดียวกันดังนั้นหากมีhardlinks ที่ไม่อิ่มตัวในโฟลเดอร์ที่คุณต้องการลบการใช้ takeown และ icacls จะเปลี่ยนการอนุญาตและเจ้าของไฟล์ภายนอก แฟ้ม.
การใช้เครื่องมือln.exeคุณสามารถแสดงรายการไฟล์ทั้งหมดที่ฮาร์ดลิงก์ภายในโฟลเดอร์และรู้ว่าไฟล์นั้นเชื่อมโยงไปยังไฟล์ที่อยู่นอกโฟลเดอร์ ( ฮาร์ดลิงก์ที่ไม่อิ่มตัว) หรือไม่:
ln.exe --enum foldername > HardlinksList.txt
การลบโฟลเดอร์เร็วกว่าการลบหลายไฟล์
ดังนั้นหากคุณต้องการใช้เม้าส์แทนการใช้ command prompt คุณสามารถสร้างไดเร็กตอรี่ย้ายไฟล์ไปที่นั่นแล้วลบมัน (ด้วย Shift + Del ตามที่คุณพูด)