คุณไม่จำเป็นต้อง pathnames ยาวถ้าคุณลงในไดเรกทอรีและใช้เพียงเส้นทางเทียบกับchdir
rmdir
หรือถ้าคุณติดตั้งเชลล์ POSIX หรือพอร์ตนี้ไปยัง DOS ที่เทียบเท่า:
# untested code, didn't bother actually testing since the OP already solved the problem.
while [ -d Folder1 ]; do
mv Folder1/Folder1/Folder1/Folder1 tmp # repeat more times to work in larger batches
rm -r Folder1 # remove the first several levels remaining after moving the main tree out
# then repeat to end up with the remaining big tree under the original name
mv tmp/Folder1/Folder1/.../Folder1 Folder1
rm -r tmp
done
(การใช้ตัวแปรเชลล์เพื่อติดตามตำแหน่งที่คุณเปลี่ยนชื่อสำหรับเงื่อนไขลูปเป็นอีกทางเลือกหนึ่งในการคลายลูปเหมือนที่ฉันทำที่นั่น)
สิ่งนี้จะช่วยหลีกเลี่ยงค่าใช้จ่าย CPU ของโซลูชันของ KenD ซึ่งบังคับให้ OS สำรวจต้นไม้จากด้านบนไปยังn
ระดับ th ทุกครั้งที่มีการเพิ่มระดับใหม่การตรวจสอบสิทธิ์เป็นต้นดังนั้นจึงมีsum(1, n) = n * (n-1) / 2 = O(n^2)
ความซับซ้อนของเวลา โซลูชั่นที่ตัดชิ้นส่วนจากจุดเริ่มต้นของลูกโซ่ควรเป็นO(n)
เว้นแต่ว่า Windows จำเป็นต้องสำรวจทรีเมื่อทำการเปลี่ยนชื่อไดเรกทอรีหลัก (Linux / Unix ไม่ได้) วิธีแก้ปัญหาที่chdir
ถึงด้านล่างของต้นไม้และใช้เส้นทางสัมพัทธ์จากที่นั่นลบไดเรกทอรีที่พวกเขาchdir
สำรองควรเป็นO(n)
สมมติว่าระบบปฏิบัติการไม่จำเป็นต้องตรวจสอบทั้งหมดของคุณ พาเรนต์ไดเร็กทอรีทุกการเรียกของระบบเมื่อคุณทำสิ่งต่าง ๆ ขณะที่อยู่ใน CD
find Folder1 -depth -execdir rmdir {} +
จะเรียกใช้ rmdir ขณะที่ซีดีไปยังไดเรกทอรีที่ลึกที่สุด หรือที่จริงหาของตัวเลือกที่ทำงานบนไดเรกทอรีและหมายถึง-delete
-depth
ดังนั้นfind Folder1 -delete
ควรทำสิ่งเดียวกันแน่นอน แต่เร็วกว่า ใช่ GNU พบบนลินุกซ์ให้สิ้นซากโดยการสแกนไดเรกทอรี CDing ไดเรกทอรีย่อยกับทางญาติแล้วกับทางญาติแล้วrmdir
chdir("..")
มันไม่สแกนไดเรกทอรีในขณะที่ขึ้นมาดังนั้นมันจะกินO(n)
แรม
นั่นคือจริงๆประมาณ: strace
แสดงให้เห็นว่ามันใช้จริงunlinkat(AT_FDCWD, "tmp", AT_REMOVEDIR)
, open("..", O_DIRECTORY|...)
และfchdir(the fd from opening the directory)
มีพวงของfstat
สายผสมในเกินไป แต่เอฟเฟกต์จะเหมือนกันถ้าทรีไดเรกทอรีไม่ได้รับการแก้ไขขณะที่ find กำลังทำงาน
แก้ไข: เพียงเพื่อความบันเทิงฉันได้ลองทำสิ่งนี้บน GNU / Linux (Ubuntu 14.10 บน CPU Core2Duo รุ่นแรก 2.4GHz บนระบบไฟล์ XFS บนไดรฟ์ WD 2.5TB Green Power (WD25EZRS))
time mkdir -p $(perl -e 'print "annoyingfoldername/" x 2000, "\n"')
real 0m1.141s
user 0m0.005s
sys 0m0.052s
find annoyingfoldername/ | wc
2000 2000 38019001 # 2k lines / 2k words / 38M characters of text
ll -R annoyingfoldername
... eventually
ls: cannot access ./annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername: File name too long
total 0
?????????? ? ? ? ? ? annoyingfoldername
time find annoyingfoldername -delete
real 0m0.054s
user 0m0.004s
sys 0m0.049s
# about the same for normal rm -r,
# which also didn't fail due to long path names
(mkdir -p สร้างไดเรกทอรีและส่วนประกอบของพา ธ ที่หายไป)
ใช่ 0.05 วินาทีจริงสำหรับ 2k rmdir ops xfs ค่อนข้างดีในการรวบรวมการดำเนินการเมตาดาต้าเข้าด้วยกันในบันทึกประจำวันเนื่องจากพวกเขาแก้ไข meta data ops ช้าเหมือนเมื่อ 10 ปีที่แล้ว
บน ext4 สร้างใช้เวลา 0m0.279s ลบโดยที่ find ยังใช้เวลา 0m0.074s
/MIR
แทน:ROBOCOPY /MIR C:\temp\EmptyDirectory C:\Storage\Folder1
ก็อาจจะคุ้มค่าที่จะทำงานchkdsk
เพียงเพื่อหัวเราะคิกคัก