मैं बहुत सारे सबफ़ोल्डर के साथ तेजी से एक फ़ोल्डर कैसे हटा सकता हूं?


15

मेरे पास 266778 सबफ़ोल्डर के साथ एक फ़ोल्डर है। मैं इसे कैसे हटा सकता हूं?

मैंने कोशिश की है

cd ~/.local/share/Trash/
sudo rm -rf *

लेकिन इसमें बहुत समय लगता है। 1 मिनट 25 सेकंड के वास्तविक समय और 0.072 सेकंड के उपयोगकर्ता समय के बाद यह केवल 2500 फ़ोल्डर्स को हटा देता है। इस तरह, इस फ़ोल्डर को हटाने में दो घंटे से अधिक का समय लगेगा।

क्या इस फ़ोल्डर को हटाने का एक तेज़ तरीका है? उपयोगकर्ता समय और वास्तविक समय के बीच इतना बड़ा अंतर क्यों है?

real    1m25.474s
user    0m0.072s
sys     0m28.142s

मैं लिनक्स 2.6.32 (Ubuntu 10.04.4 LTS) का उपयोग करता हूं।


मैंने अभी-अभी इस समस्या को हल किया है और ऐसा लगता है कि कुछ लोगों ने पता लगाया है कि rsync को "कई-फाइल-विलोपन" टूल के रूप में काफी कुशलता से इस्तेमाल किया जा सकता है। मूल्यांकन करने के लिए यह वास्तव में तेज़ है या नहीं।
जोहान

2
इसके लायक यह है: कई फ़ोल्डर्स / फ़ाइलों को हटाने पर प्रदर्शन अत्यधिक फाइल सिस्टम पर निर्भर है। मेरे अनुभव में एक्स 3 (धीमी) बनाम एक्सएफएस (तेज) पर लाखों छोटी फ़ाइलों को हटाने में अंतर घंटों हो सकता है।
पोदो

यदि आपके पास अक्सर यह मामला है और आप आगे की योजना बना सकते हैं, तो एक फाइल सिस्टम जैसे कि btrfs और एक सबवोल्यूम का उपयोग करके, आप उस सबवूम को केवल डंप करके चीजों को तेज कर सकते हैं।
प्लाज़्मा एचएच

यहाँ वह जगह है जहाँ आप उत्तर पा सकते हैं। पर्ल वन सबसे तेज है। unix.stackexchange.com/questions/37329/…
एसडीसोलर

जवाबों:


17

यदि आपके "संस्करण" का संस्करण उप-कमांड को लागू करता है, तो आप कोशिश कर सकते हैं

find directory -delete

इस मामले में:

find ~/.local/share/Trash/ -delete

कुछ कमांड, जैसे rm, अपना अधिकांश कार्य कर्नेल में करते हैं। फ़ाइल-सिस्टम दिनचर्या में, सटीक होना। उस समय के लिए बिताए जाने वाले सिस्टम कॉल का समय इस तरह से होता है, इसलिए जब तक आपका "आरएम" कमांड लंबे समय तक चलता है, तब तक यह उपयोगकर्ता-भूमि में बहुत काम नहीं करता है - सिस्टम कॉल अधिकांश कार्य करता है।


+1; हालांकि यह भी माता पिता निर्देशिका हट जाता है और मुझे लगता है ओपी केवल ट्रैश फ़ोल्डर फ़ोल्डर नहीं ही की सामग्रियों को हटाना चाहता था
don_crissti

1
@don_crissti: अच्छी टिप्पणी। अगर ओपी केवल ~ / .local / share / कचरा (और 1 स्तर पर फ़ाइलें नहीं) के तहत उप-विभाजनों को हटाना चाहता था, तो: find ~/.local/share/Trash/*/ -delete (बेशक, यह उन ट्रैश / * में से किसी में भी फ़ाइलों (और dirs) को हटा देगा। साथ ही साथ)
ओलिवियर दुलक

2
+1 के विचित्र व्यवहार को समझाने के लिएtime
मार्टिन थोमा

3
क्या find directory -deleteवाकई इससे तेज है rm -rf directory? आखिरकार, वे एक ही काम करते हैं, और इसे करने के दो तरीके नहीं हैं।
गिल्स एसओ- बुराई को रोकें '

1
@ जोहान खोज वास्तव में तेज है। क्या आपको कभी इसका कारण जानने का मौका मिला?
हर्षदीप

20

यह उपवास की आपकी परिभाषा पर निर्भर करता है । पहले से ही यहां दिए गए उत्तर वास्तव में फाइलसिस्टम से निर्देशिकाओं को हटाने के लिए एक अच्छा समाधान देते हैं, लेकिन अगर आपको वास्तव में जितनी जल्दी हो सके निर्देशिका नाम को मुक्त करने की आवश्यकता है , एक ही फाइल सिस्टम पर एक नाम तात्कालिक है:

{ mv directory directory.gone && rm -rf directory.gone; } &

तकनीकी रूप से यह धोखा है क्योंकि मैंने वास्तविक विलोपन नहीं किया है, लेकिन व्यावहारिक रूप से यह बहुत उपयोगी है: मैं हर समय इस चाल का उपयोग करता हूं इसलिए मुझे धीमी गति से हटाने के संचालन की प्रतीक्षा नहीं करनी चाहिए।


महान। हर समय ऐसा करने के लिए आपका उपयोग मामला क्या है? यदि आप इसे बहुत करते हैं, तो क्या ऐसा कोई खतरा नहीं है जिसे आप बैकलॉग करेंगे, एकाधिक 'directory.gone' प्राप्त करें और असफल हो जाएं? मुझे लगता है कि आप '$ $' या '% (दिनांक ...)' जैसे प्रत्यय का उपयोग करते हैं
smci

1
अगर मुझे जरूरत है कि मैं शायद तर्कों के साथ mktemp का उपयोग कर सकता हूं जो यह सुनिश्चित करता है कि यह एक ही फाइल सिस्टम पर रहता है। लेकिन मैं यह नहीं कह सकता कि मेरे पास अभी एक विशिष्ट उदाहरण है।
कोजीरो

kojiro हाँ धन्यवाद, mktempजो मैं याद करने की कोशिश कर रहा था ...
1

1

rm -rf directoryया rm -rf *निश्चित रूप से सबसे तेज़ तरीका है जब तक कि आपका स्थानीय rmकार्यान्वयन टूट न जाए।

उपयोग करने findसे कोई लाभ नहीं है।

चाहे यह तेज या धीमा हो, मुख्य रूप से फाइलसिस्टम और ओएस कार्यान्वयन पर निर्भर करता है। अतः प्रश्न अनुचित प्रतीत होता है।

सोलारिस पर यूएफएस और जेडएफएस को इस तरह के कार्य के साथ बहुत तेजी से जाना जाता है क्योंकि दोनों फाइलसिस्टम कार्यान्वयन में विलंबित पृष्ठभूमि को हटाने का कोड शामिल है, जो संबंधित वस्तु को तेजी से वापस जाने का कारण बनता है unlink()और rmdir()तब भी कॉल करता है जब संबंधित वस्तु कुल समय में अधिक समय लेगी।

कर्नेल में देरी की पृष्ठभूमि को हटाने के साथ, निर्देशिका अपडेट तेजी से किया जा सकता है और यह पूरे ऑपरेशन को गति देने में मदद करता है।


जबकि किसी को यह सोचने के लिए माफ किया जा सकता है कि, यह वास्तव में सच नहीं है, क्योंकि यह उत्तर बताता है।
Hitechcomputergeek

0

यह केवल एक आंशिक उत्तर है, तीन मानों पर प्रकाश डालता है जो कमांड रिटर्न करता है; time(1)मैनपेज से उद्धृत :

(i) आह्वान और समाप्ति के बीच का वास्तविक समय, (ii) उपयोगकर्ता सीपीयू समय ( tms_utimeऔर वापस दिए गए tms_cutimeमानों का योग ), और (iii) सिस्टम CPU समय ( एक का मान और मान) के रूप में ) द्वारा लौटाई गई । "struct tmstimes(2)tms_stimetms_cstimestruct tmstimes(2)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.