यदि आपको 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
(लूप स्थिति के लिए इसका नाम बदलकर ट्रैक करने के लिए शेल चर का उपयोग करना, लूप को अनियंत्रित करने का दूसरा विकल्प है जैसे मैंने वहां किया था।)
यह केनडी के समाधान के सीपीयू ओवरहेड से बचा जाता है, जो ओएस को पेड़ से ऊपर से n
वें स्तर तक हर बार एक नया स्तर जोड़ने, अनुमतियों की जांच आदि के लिए मजबूर करता है, इसलिए इसमें sum(1, n) = n * (n-1) / 2 = O(n^2)
समय की जटिलता होती है। समाधान जो श्रृंखला की शुरुआत से एक पंक को बंद करते हैं O(n)
, जब तक कि विंडोज को अपने मूल निर्देशिका का नाम बदलने के दौरान एक पेड़ को पार करने की आवश्यकता न हो । (लिनक्स / यूनिक्स नहीं है।) समाधान जो chdir
पेड़ के नीचे तक सभी तरह से आते हैं और वहां से रिश्तेदार रास्तों का उपयोग करते हैं, निर्देशिकाओं को हटाते हुए जैसे वे chdir
वापस आते हैं, वैसे ही O(n)
, यह मानते हुए कि ओएस को आपके सभी की जांच करने की आवश्यकता नहीं है पैरेंट डाइरेक्टरी हर सिस्टम कॉल, जब आप काम करते हैं तो कहीं न कहीं सीडेड।
find Folder1 -depth -execdir rmdir {} +
rmdir चलाएंगे, जबकि सबसे गहरी निर्देशिका में सीडी। या वास्तव में, खोज का -delete
विकल्प निर्देशिकाओं पर काम करता है, और इसका मतलब है -depth
। तो find Folder1 -delete
ठीक वही काम करना चाहिए, लेकिन तेजी से। हाँ, जीएनयू लिनक्स पर एक निर्देशिका को स्कैन करके, सापेक्ष पथों के साथ उपनिर्देशिकाओं के लिए, फिर rmdir
एक सापेक्ष पथ के साथ , फिर उतरता है chdir("..")
। यह आरोही करते समय निर्देशिकाओं का पुनरुत्थान नहीं करता है, इसलिए यह O(n)
रैम का उपभोग करेगा ।
: यह वास्तव में एक सन्निकटन था strace
पता चलता है कि यह वास्तव में उपयोग करता है unlinkat(AT_FDCWD, "tmp", AT_REMOVEDIR)
, open("..", O_DIRECTORY|...)
और fchdir(the fd from opening the directory)
, के एक समूह के साथ fstat
भी में मिलाया कॉल। लेकिन प्रभाव एक ही है अगर निर्देशिका ट्री संशोधित नहीं हो रहा है जबकि खोज चल रही है।
संपादित करें: सिर्फ kicks के लिए, मैंने GNU / Linux (Ubuntu 14.10, 2.4GHz फर्स्ट-जीन Core2Duo CPU पर, WD 2.5TB ग्रीन पावर ड्राइव (WD25EZRS) पर XFS फाइलसिस्टम पर) यह कोशिश की।
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 एक निर्देशिका और किसी भी लापता पथ घटक बनाता है)।
हाँ, 2k rmdir ops के लिए वास्तव में 0.05 सेकंड। पत्रिका में मेटाडेटा संचालन को एक साथ करने में एक्सएफ़एस काफी अच्छा है, क्योंकि वे मेटा डेटा ऑप्स 10 साल पहले की तरह धीमा थे।
Ext4 पर, बनाएं 0m0.279s, अभी भी लिया गया 0m0.074s के साथ हटाएं।
/MIR
इसके बजाय कोशिश करूँगा :ROBOCOPY /MIR C:\temp\EmptyDirectory C:\Storage\Folder1
यह भीchkdsk
सिर्फ गिगल्स के लिए चलने लायक हो सकता है ।