मेरे पास एक फ़ोल्डर है जिसमें कई फाइलें हैं और "rm -rf" को पूरा होने में बहुत समय लगता है। क्या किसी निर्देशिका को हटाने का कोई तेज़ तरीका है और यह सामग्री (उपखंड, आदि) है?
मेरे पास एक फ़ोल्डर है जिसमें कई फाइलें हैं और "rm -rf" को पूरा होने में बहुत समय लगता है। क्या किसी निर्देशिका को हटाने का कोई तेज़ तरीका है और यह सामग्री (उपखंड, आदि) है?
जवाबों:
आप निर्देशिका के लिए inode अनलिंक करने की कोशिश कर सकते, लेकिन वह अनाथ फ़ाइलों की एक पूरी लोड है कि आप के साथ छोड़ जाएगा fsck
होगा के बारे में पता फ्लिप।
rm
जितना अच्छा हो उतना अच्छा है।
कुछ लोग बढ़त के मामलों का उल्लेख कर रहे हैं जहां कुछ चीजें दूसरों की तुलना में तेज हैं। लेकिन यह सुनिश्चित करें कि हम समान चीजों के सर्वोत्तम संस्करणों की तुलना कर रहे हैं।
यदि आप एक निर्देशिका और उसमें सब कुछ हटाना चाहते हैं, तो मैं आपको सुझाव दे रहा हूं:
rm -rf path/to/directory
rm
आंतरिक रूप से उन फ़ाइलों और निर्देशिकाओं को सूचीबद्ध करेगा जिन्हें वह हटाने जा रहा है। और यह सब संकलित C है । यह उन दो कारणों से यह सबसे तेज है।
यह बहुत स्पष्ट रूप से एक ही बात नहीं है, rm -rf path/to/directory/*
जो शेल स्तर पर विस्तार करेगा और तर्कों का एक भार पारित करेगा rm
। फिर rm
उन लोगों को पार्स करना है और फिर प्रत्येक से पुनरावृत्ति करना है। यह बहुत धीमी है।
एक "बेंचमार्क" के रूप में जिसकी तुलना find path/to/directory -exec {} \;
बकवास है। यह rm
प्रति फ़ाइल एक बार चलता है। बहुत धीरे। ढूँढें xargs- शैली के निर्माण के साथ तर्क वितर्क कर सकते हैं, -exec rm {} +
लेकिन यह विस्तार की तरह ही धीमा है। आप कॉल कर सकते हैं -delete
जो unlink
कर्नेल के लिए एक आंतरिक कॉल का उपयोग करता है (जैसे rm
करता है) लेकिन यह केवल पहली बार फाइलों के लिए काम करेगा।
इसलिए दोहराने के लिए, जब तक आप डिस्क को तरल गर्म मैग्मा में नहीं फेंकते, rm
राजा है ।
संबंधित नोट पर, विभिन्न फाइल सिस्टम अलग-अलग दरों पर चीजों को हटाते हैं क्योंकि वे कैसे संरचित हैं। यदि आप ऐसा नियमित रूप से कर रहे हैं, तो आप इन फ़ाइलों को XFS में स्वरूपित विभाजन में संग्रहित करना चाहते हैं, जो डिलीट करने के लिए बहुत तेजी से संभालता है।
या तेज डिस्क का उपयोग करें। यदि आपके पास टन रैम है, तो /dev/shm
(रैम डिस्क) का उपयोग करना एक विचार हो सकता है।
unlink
निर्देशिकाओं पर सिस्टम कॉल का उपयोग नहीं कर सकते हैं (आपको एक EISDIR
त्रुटि मिलेगी ), ताकि पहला विकल्प संभव न हो।
mv
विभिन्न फाइल सिस्टम / विभाजनों के बीच आईएनजी का अर्थ है एक के cp
बाद एक rm
।
/tmp
एक ही फाइल सिस्टम पर है, तो मुझे आश्चर्य है कि क्या mv
और पुनः आरंभ करना जल्दी होगा? मुझे यकीन नहीं है कि अगर /tmp
किसी rm
भी तरह से साफ कर दिया जाए।
rsync
इस बेंचमार्क मामले में तेजी से है rm -rf
: web.archive.org/web/20130929001850/http://linuxnote.net/…
कभी-कभी, find $DIR_TO_DELETE -type f -delete
की तुलना में तेजी से होता है rm -rf
।
आप कोशिश भी कर सकते हैं mkdir /tmp/empty && rsync -r --delete /tmp/empty/ $DIR_TO_DELETE
।
अंत में, यदि आपको पूरे विभाजन की सामग्री को हटाने की आवश्यकता है, तो सबसे तेज़ शायद होगा umount
, mkfs
और फिर से mount
।
type -f
फ़ाइल को निरूपित नहीं करना है और निर्देशिका नहीं है? साथ ही, -print
फ़ाइलों को जोड़ने से पता चलता है कि वे हटाए जा रहे हैं।
यदि आपको खाली स्थान की आवश्यकता नहीं है, तो सबसे तेज़ तरीका विलम्ब होने में देरी करता है और पृष्ठभूमि में ऐसा करें:
फिर एक कॉरेस्टब है जो इसे पृष्ठभूमि में करता है, एक शांत समय पर, कम I / O हठ के साथ:
3 3 * * * root ionice -c 3 nice find /path/to/.delete_me -maxdepth 1 ! -name \. -exec echo rm -rf "{}" +
टिप्पणियाँ:
अपडेट: मुझे समानांतर में कई आरएम चलाने के लिए एक साफ चाल मिली - यह आपकी बड़ी डिस्क सरणी होने पर मदद करेगा:
ionice -c 3 nice find target_directory -depth -maxdepth 3 | xargs -d \n -P 5 -n 5 rm -rf
—पड़ना to do a deep-first traversal।
-मैक्सडेप्ट निर्देशिका ट्रैवर्सल की गहराई को सीमित करने के लिए ताकि हम अलग-अलग फ़ाइलों को सुनकर समाप्त न हों।
फ़ाइल नाम में रिक्त स्थान को संभालने के लिए -d \ n।
--P -n समानांतरवाद (चेक मैनपेज) की डिग्री को संभालता है।
रेफरी: http://blog.liw.fi/posts/rm-is-too-slow/#comment-3e028c69183a348ee748d904a7474019
अपडेट 2 (2018): Ubuntu 18.04 के साथ ZFS द्वारा भेजे जाने के साथ मैं इसे हर चीज के लिए उपयोग करता हूं और मैं किसी भी बड़े प्रोजेक्ट के लिए एक नया डेटासेट बनाऊंगा । यदि आप आगे की योजना बनाते हैं और पहले से ऐसा करते हैं, तो आप बस एक फाइल सिस्टम को "जबर्दस्ती नष्ट" कर सकते हैं। ;-)
मैंने zfsonlinux विकी के निर्देशों का उपयोग करके मूल रूप से Ubuntu को ZFS स्थापित किया: https://github.com/zfsonlinux/zfs/wiki/Ubuntu-18.04-Root-on-ZFS
find target_dir -maxdepth 3 -depth -type d -print0 | xargs -0 -P 5 rm -rf
। -depth
विकल्प बताता find
पहली सूची बच्चों के लिए।
मुझे लगता है कि मुद्दा यह है कि एक बहुत बड़ी निर्देशिका को हटाने का कोई सही तरीका नहीं है और इसके संपूर्ण सेट के साथ एक सच्ची अनुक्रमित फाइलिंग प्रणाली है जो कि अनलिंकिंग को समझती है और इसका मतलब यह नहीं है कि यह याद करती है कि इसमें गायब फाइलें ala FSCK है। एक भरोसा रखना पड़ता है।
उदाहरण के लिए मेरे पास एक गोल्फ रेंज के लिए चलने वाला ज़ोनइमाइंडर है। मैंने डेढ़ टीबी की एक बड़ी छापेमारी का निर्माण किया, जिसमें वह एक दिन (12 कैमरा फीड) पर कब्जा करने वाले डेटा की अपार मात्रा को संभालती है कि वह 120 जीबी ड्राइव पर कैसे चलती है, यह मेरे से परे है। सभी कैप्चर किए गए डेटा के लिए लंबी कहानी का छोटा सा हिस्सा उसके स्टोरेज का लगभग 1.4 टीबी है। शुद्ध करने के लिए बहुत सारे
ZM को फिर से स्थापित करने और 1.4 टीबी पुरानी लाइब्रेरी को शुद्ध करने में कोई मज़ा नहीं है क्योंकि पुरानी छवियों को हटाने के लिए 1 - 2 दिन लग सकते हैं।
एक सही अनुक्रमित एफएस निर्देशिका को छोड़ने की अनुमति देता है और जानता है कि इसके तहत डेटा मर चुका है और डेटा को शून्य करना हमारे समय और पीसी संसाधनों की बर्बादी है। यह हटाए गए डेटा को शून्य करने का विकल्प होना चाहिए। RM केवल ext4 पर वास्तविक दुनिया में लंबे समय तक ले जाता है।
उत्तर: सभी फ़ाइलों को आसानी से अनलिंक करने से तेज़ी से कम होगा, लेकिन आपको अभी भी FSCK को चलाने के लिए एक समय निर्धारित करना होगा।
एक स्क्रिप्ट बनाएं जो आपके फोल्डर के नीचे सभी फ़ाइलों को "अनलिंक" करने के लिए एक पुनरावर्ती "कमांड" को चलाएं, फिर इसे साफ करने के लिए सभी फ़ोल्डरों को rm या rmdir करें। अपने सुविधाजनक होने पर शेष डेटा को शून्य करने के लिए मैन्युअल रूप से FSCK चलाएं। किंडा आलसी ने इसे सॉरी नहीं लिखा :)।
यदि आप किसी मौजूदा निर्देशिका को शुद्ध करना चाहते हैं, तो उपयोगी नहीं है, मैं उल्लेख करता हूं कि एक संभावित रणनीति यदि आप जानते हैं कि आपके पास एक निर्देशिका होगी जिसमें फ़ाइलों की एक लूप होगी जिसे आपको नियमित रूप से शुद्ध करने की आवश्यकता होगी, निर्देशिका को अपने स्वयं के फाइल सिस्टम पर रखना होगा ( जैसे , विभाजन)। फिर जब आपको इसे शुद्ध करने की आवश्यकता होती है, तो इसे अनमाउंट करें, चलाएंmkfs
, और इसे रिमाउंट करें। उदाहरण के लिए OpenBSD/usr/obj
इसके लिए ऐसा करने की सलाह देता है , जहां सिस्टम के निर्माण के दौरान कई फाइलें बनाई जाती हैं, और अगले निर्माण से पहले हटा दी जानी चाहिए।