कैसे rm -r पुनरावर्ती को हटाने के बारे में जाता है? किस क्रम में?


30

क्या संचालन का कुछ क्रम है rm? मैंने rmएक बड़ी निर्देशिका पर प्रदर्शन किया और उत्सुक हूं कि मुझे यह देखना चाहिए कि क्या हटा दिया गया है। rmपहले फाइलों पर काम करता है , फिर निर्देशिकाओं पर? या यह इनकोड टेबल की कुछ जानकारी पर आधारित है?

ऐनक: GNU कोरुटिल्स 8.22 सिस्टम से rm: एक बीगलबोनब्लैक फाइलसिस्टम पर चलने वाला आर्क लिनक्स USB 2.0 का उपयोग करते हुए एक बाहरी सीगेट एचडीडी (ext4) था।

पृष्ठभूमि की कहानी:

मैं कुछ निर्देशिका सफाई और प्रदर्शन कर रहा था

cp -r A/ B/ C/ Dest/

अनजाने में, मैं उस के साथ पीछा किया

rm -r A/ B/ C/ Dest/

जब मेरा मतलब सिर्फ प्रदर्शन करना था

rm -r A/ B/ C/

मैंने इसे पकड़ा और मारा Ctrl+ Cइससे पहले कि बहुत समय बीत चुका था। विशेष रूप से, यह <3 सेकंड था क्योंकि मैं timeकमांड के साथ संयोजन में rm& का उपयोग कर रहा था cp। मैं में चला गया और जांच की Dest/उम्मीद कर यह न के बराबर हो सकता है, लेकिन लो और निहारना यह पूरे था और दिखाई दिया प्रभावित नहीं करने के लिए। यह थोड़ा आश्चर्यजनक है क्योंकि A/ B/ C/ये काफी छोटे थे। शायद 100-200 एमबी कुल। Dest/हालाँकि, केवल 1TB से शर्मीली है। डेस्टिनेशन lsपर प्रदर्शन / दिखाया कि वर्णमाला के दोनों सिरों (जैसे AFile.txt.... .... Zoo.txt) पर दोनों फाइलें और निर्देशिकाएं थीं ।

क्या मैं भाग्यशाली हो गया और rmअपने गंतव्य / निर्देशिका पर कहर बरपाने ​​से पहले इसे रद्द कर दिया ? क्या यह rmवास्तव में धीमा है (शुक्र है!)

यदि नहीं, तो rmपुनरावर्ती चीजों के बारे में कैसे जाना जाता है कि मैं अनुमान लगा सकता हूं कि क्या खो गया हो सकता है?

मैं वास्तव में जो मैंने खो दिया है उसे ठीक करने की उम्मीद नहीं कर रहा हूं, बस उत्सुक था कि क्या संभावित रूप से उड़ा दिया गया था।


जवाबों:


34

rm -rबदले में इसके प्रत्येक तर्क पर काम करता है। यदि एक तर्क एक निर्देशिका है, तो यह निर्देशिका ( कार्यों opendirऔर readdirकार्यों या कुछ समकक्ष विधि के साथ) को सूचीबद्ध करता है , और बदले में प्रत्येक प्रविष्टि पर काम करता है। यदि कोई प्रविष्टि निर्देशिका है, तो वह उस प्रविष्टि को पुन: खोजता है।

यह बिल्कुल वैसा ही तरीका है कि अन्य अनुप्रयोगों रिकर्सिवली पार निर्देशिका करने के लिए उपयोग - find, ls -Rfआदि

ट्रैवर्सल का आदेश अप्रत्याशित है। अधिकांश फाइल सिस्टमों पर, जब तक कोई फ़ाइल नहीं जोड़ी जाती है, तब तक यह क्रम प्रजनन योग्य होता है, निर्देशिका में हटा दिया जाता है या इसका नाम बदल दिया जाता है (सिद्धांत में आदेश पूरी तरह से यादृच्छिक हो सकता है और हर बार बदल सकता है, लेकिन मैं एक फाइल सिस्टम के बारे में नहीं सोच सकता जहाँ ऐसा होता है)। कुछ फाइल सिस्टमों पर, ऑर्डर को सामान्य रूप से फाइल नामों से या उस क्रम से घटाया जा सकता है जिसमें फाइलें बनाई गई थीं या दोनों का संयोजन था, लेकिन आपको फाइल सिस्टम के बारीक विवरणों को जानना होगा, और यह अलग-अलग हो सकता है। ड्राइवर संस्करण। ट्रैवर्सल का क्रम कुछ ऐसा नहीं है जिस पर आप भरोसा कर सकते हैं।

ध्यान दें कि lsया echo *उनके नाम के लेक्सोग्राफ़िक क्रम में फ़ाइलों को क्रमबद्ध करें। findऔर ls -fक्रमबद्ध न करें।

एक बात जिस पर आप भरोसा कर सकते हैं वह यह है कि तर्कों को क्रम में संभाला जाता है। इसलिए अगर C/अभी भी आंशिक रूप से वहाँ था, तो इसका मतलब यह होगा कि Dest/अछूता था। यदि C/चला गया है, तो आप इस बात का अंदाजा लगा सकते हैं Dest/कि निर्देशिका संशोधन समय की जाँच करके फ़ाइलों को कहाँ हटा दिया गया है और उनकी तुलना समय C/नष्ट होने या प्रतिलिपि समाप्त होने के समय से की गई है। डिलीट की जाने वाली पहली फाइल सीधे Dest/या कहीं और पदानुक्रम में गहरी हो सकती है, जो इस बात पर निर्भर करता है कि ट्रैवर्स में Dest/जो पहली एंट्री rmहुई थी वह डायरेक्टरी थी या नहीं।

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


2
के -fविकल्प के lsसमान होने के रूप में प्रलेखित किया गया है -aU, जहां -aसभी फ़ाइलों की सूची का -Uअर्थ है और अनसोल्ड का मतलब है। मुझे अस्पष्ट रूप से एक संस्करण का सामना करना पड़ता है ls, जिसमें -fकाम नहीं किया था (मुझे लगता है कि इसे कुछ और होने के लिए परिभाषित किया गया था) लेकिन -aUकिया था।
जी-मैन का कहना है कि मोनिका की बहाली '

2
@ G-Man POSIX परिभाषित करता है -f(एक XSI एक्सटेंशन के रूप में ); यह वास्तव में अनसुलझी से परे अन्य प्रभाव है। यह V7 पर वापस जाता है, इसलिए आपको इसके बिना कार्यान्वयन को खोजने में मुश्किल होगी, अजीब तरह से, बिजीबॉक्स। -Uसिर्फ अनसोल्ड के लिए एक GNU फीचर है, मुझे नहीं लगता कि यह कहीं और मौजूद है।
गिलेस एसओ- बुराई को रोकना '


@ समय नं। आप ls -Uएक निर्देशिका में चलाकर परीक्षण कर सकते हैं । यह वही आदेश है जो rm -rउस निर्देशिका में काम करेगा। ध्यान दें कि एक फ़ाइल को जोड़ना या निकालना अन्य फ़ाइलों के क्रम को बदल सकता है।
गिल्स एसओ- बुराई को रोकना '

धन्यवाद। (1) "किसी फ़ाइल को जोड़ने या हटाने से अन्य फ़ाइलों का क्रम बदल सकता है।", इसलिए आकस्मिक आंशिक निष्कासन के बाद, ls -Uयह पता लगाने में मदद नहीं करता है कि क्या जीवित डायर अछूते हैं? (2) -U का अर्थ है "निर्देशिका क्रम में सूची प्रविष्टियाँ"। क्या -U का अर्थ है निर्देशिका निर्देशिका का क्रम dir?
टिम

5

जैसा कि गाइल्स कहते हैं, आप आमतौर पर किसी निर्देशिका के भीतर विलोपन के आदेश की भविष्यवाणी नहीं कर सकते हैं, केवल यह कि शीर्ष-स्तरीय निर्देशिकाओं को कमांड लाइन पर क्रम में संसाधित किया जाएगा।

हालाँकि, आप यह भी गारंटी देते हैं कि यह निर्देशिका पदानुक्रम को नीचे से हटा देगा, क्योंकि यूनिक्स केवल निर्देशिकाओं को हटाए जाने की अनुमति देता है यदि वे खाली हैं। तो एक डायरेक्टरी को हटाने के लिए, पहले उसे इसमें सब कुछ हटाना होगा। यदि इसमें उपनिर्देशिकाएँ हैं, तो उन्हें पहले अपनी सामग्री को हटाना होगा, और इसी तरह।

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