क्या "rm -rf" की तुलना में किसी निर्देशिका को हटाने का कोई तेज़ तरीका है?


32

मेरे पास एक फ़ोल्डर है जिसमें कई फाइलें हैं और "rm -rf" को पूरा होने में बहुत समय लगता है। क्या किसी निर्देशिका को हटाने का कोई तेज़ तरीका है और यह सामग्री (उपखंड, आदि) है?


किसी को भी रुचि रखते देखें: slashroot.in/comment/1286#comment-1286 खोजने के तुरुप पर्ल तुरुप rsync
Rinzwind

जवाबों:


33

आप निर्देशिका के लिए 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 / tmp अधिक तेज होगा? ऐसा लगता है कि एमवी को बहुत समय लगता है।
मोहम्मद मोघिमी

@MohammadMoghimi: mvविभिन्न फाइल सिस्टम / विभाजनों के बीच आईएनजी का अर्थ है एक के cpबाद एक rm
enzotib

3
@enzotib हालांकि, अगर /tmpएक ही फाइल सिस्टम पर है, तो मुझे आश्चर्य है कि क्या mvऔर पुनः आरंभ करना जल्दी होगा? मुझे यकीन नहीं है कि अगर /tmpकिसी rmभी तरह से साफ कर दिया जाए।
स्पार्कवाक

1
rsyncइस बेंचमार्क मामले में तेजी से है rm -rf: web.archive.org/web/20130929001850/http://linuxnote.net/…
schmijos

11

कभी-कभी, find $DIR_TO_DELETE -type f -deleteकी तुलना में तेजी से होता है rm -rf

आप कोशिश भी कर सकते हैं mkdir /tmp/empty && rsync -r --delete /tmp/empty/ $DIR_TO_DELETE

अंत में, यदि आपको पूरे विभाजन की सामग्री को हटाने की आवश्यकता है, तो सबसे तेज़ शायद होगा umount, mkfsऔर फिर से mount


1
type -fफ़ाइल को निरूपित नहीं करना है और निर्देशिका नहीं है? साथ ही, -printफ़ाइलों को जोड़ने से पता चलता है कि वे हटाए जा रहे हैं।
लीतबाकून

8

यदि आपको खाली स्थान की आवश्यकता नहीं है, तो सबसे तेज़ तरीका विलम्ब होने में देरी करता है और पृष्ठभूमि में ऐसा करें:

  • mkdir .delete_me
  • mv बिग-डायरेक्टरी-दैट-आई-वॉन्ट-गो .delete_me

फिर एक कॉरेस्टब है जो इसे पृष्ठभूमि में करता है, एक शांत समय पर, कम I / O हठ के साथ:

3 3 * * * root ionice -c 3 nice find /path/to/.delete_me -maxdepth 1 ! -name \. -exec echo rm -rf "{}" +

टिप्पणियाँ:

  • Crontab में गूंज को हटाने से पहले अपने आउटपुट की जाँच करें!
  • .delete_me निर्देशिका को एक ही फाइल सिस्टम में होना चाहिए - यदि यह सभी के लिए स्पष्ट नहीं है।

अपडेट: मुझे समानांतर में कई आरएम चलाने के लिए एक साफ चाल मिली - यह आपकी बड़ी डिस्क सरणी होने पर मदद करेगा:

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


2
उस अंतिम कमांड के बजाय, उपयोग करें find target_dir -maxdepth 3 -depth -type d -print0 | xargs -0 -P 5 rm -rf-depthविकल्प बताता findपहली सूची बच्चों के लिए।
मुरु

2

मुझे लगता है कि मुद्दा यह है कि एक बहुत बड़ी निर्देशिका को हटाने का कोई सही तरीका नहीं है और इसके संपूर्ण सेट के साथ एक सच्ची अनुक्रमित फाइलिंग प्रणाली है जो कि अनलिंकिंग को समझती है और इसका मतलब यह नहीं है कि यह याद करती है कि इसमें गायब फाइलें ala FSCK है। एक भरोसा रखना पड़ता है।

उदाहरण के लिए मेरे पास एक गोल्फ रेंज के लिए चलने वाला ज़ोनइमाइंडर है। मैंने डेढ़ टीबी की एक बड़ी छापेमारी का निर्माण किया, जिसमें वह एक दिन (12 कैमरा फीड) पर कब्जा करने वाले डेटा की अपार मात्रा को संभालती है कि वह 120 जीबी ड्राइव पर कैसे चलती है, यह मेरे से परे है। सभी कैप्चर किए गए डेटा के लिए लंबी कहानी का छोटा सा हिस्सा उसके स्टोरेज का लगभग 1.4 टीबी है। शुद्ध करने के लिए बहुत सारे

ZM को फिर से स्थापित करने और 1.4 टीबी पुरानी लाइब्रेरी को शुद्ध करने में कोई मज़ा नहीं है क्योंकि पुरानी छवियों को हटाने के लिए 1 - 2 दिन लग सकते हैं।

एक सही अनुक्रमित एफएस निर्देशिका को छोड़ने की अनुमति देता है और जानता है कि इसके तहत डेटा मर चुका है और डेटा को शून्य करना हमारे समय और पीसी संसाधनों की बर्बादी है। यह हटाए गए डेटा को शून्य करने का विकल्प होना चाहिए। RM केवल ext4 पर वास्तविक दुनिया में लंबे समय तक ले जाता है।

उत्तर: सभी फ़ाइलों को आसानी से अनलिंक करने से तेज़ी से कम होगा, लेकिन आपको अभी भी FSCK को चलाने के लिए एक समय निर्धारित करना होगा।

एक स्क्रिप्ट बनाएं जो आपके फोल्डर के नीचे सभी फ़ाइलों को "अनलिंक" करने के लिए एक पुनरावर्ती "कमांड" को चलाएं, फिर इसे साफ करने के लिए सभी फ़ोल्डरों को rm या rmdir करें। अपने सुविधाजनक होने पर शेष डेटा को शून्य करने के लिए मैन्युअल रूप से FSCK चलाएं। किंडा आलसी ने इसे सॉरी नहीं लिखा :)।


0

यदि आप किसी मौजूदा निर्देशिका को शुद्ध करना चाहते हैं, तो उपयोगी नहीं है, मैं उल्लेख करता हूं कि एक संभावित रणनीति यदि आप जानते हैं कि आपके पास एक निर्देशिका होगी जिसमें फ़ाइलों की एक लूप होगी जिसे आपको नियमित रूप से शुद्ध करने की आवश्यकता होगी, निर्देशिका को अपने स्वयं के फाइल सिस्टम पर रखना होगा ( जैसे , विभाजन)। फिर जब आपको इसे शुद्ध करने की आवश्यकता होती है, तो इसे अनमाउंट करें, चलाएंmkfs , और इसे रिमाउंट करें। उदाहरण के लिए OpenBSD/usr/obj इसके लिए ऐसा करने की सलाह देता है , जहां सिस्टम के निर्माण के दौरान कई फाइलें बनाई जाती हैं, और अगले निर्माण से पहले हटा दी जानी चाहिए।

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