रिक के साथ पुनरावृत्ति ऊपर की ओर क्यों नहीं जाती है?


13

मैं विशेष रूप से सामान्य रूप से और rm में पुनरावृत्ति की दिशा के बारे में सोच रहा हूं।

आरएम पुनरावृत्ति केवल नीचे की ओर सही काम करता है?

रनिंग: sudo rm -R *.QTFSवर्तमान निर्देशिका और उसके बच्चों में सभी * .QTFS फ़ाइलों को हटा देगा, सही है?

वर्तमान निर्देशिका जिस रूप में प्रदर्शित होती है ls -lhaउसमें एक बेहतर शब्द की कमी के लिए लिंक .और ..लिंक होते हैं , इसलिए पुनरावृत्ति निर्देशिका ट्री में ऊपर की ओर इनका पालन क्यों नहीं करती है? वहाँ rm एप्लिकेशन पर एक कृत्रिम सीमा है, या .और ..वास्तविक चीजें नहीं हैं?


5
क्योंकि जड़, और पागलपन, वह तरीका झूठ है ...
jasonwryan


1
खैर, एक दिलचस्प किस्से के लिए ... मैं अपने निर्दोष को खोजने के लिए केवल एक बिंदु पर कुछ निर्दोष दिखने वाले उपनिर्देशिकाओं पर rm -rf भाग गया कि एक उपयोगकर्ता के पास एक बहुत महत्वपूर्ण अपस्ट्रीम में हार्ड लिंक किया गया सामान था, जिसे rm ने खाने के लिए आगे बढ़ाया। हाँ, मेरे पास वर्तमान बैकअप था और कोई डेटा खो नहीं गया था, लेकिन इसे सावधानीपूर्वक कहानी होने दें ... :-)
ब्रायन नोब्लुक

@BrianKnoblauch, एक कड़ी को हटाने से क्या नुकसान हो सकता है? मुझे आपकी कहानी की बात नहीं
एलेक्सी

@Alexey बिंदु यह है कि हार्ड लिंक को स्वयं हटाया नहीं गया था। यह हार्ड लिंक्ड डायरेक्टरी में वापस आ गया, जो कि फाइलसिस्टम में एक उच्च बिंदु से जुड़ा था, इसलिए सभी का डेटा खाना शुरू कर दिया ...
ब्रायन नोब्लुच

जवाबों:


18

rm पुनरावृत्ति केवल नीचे की ओर सही काम करती है?

rm -r x yहटा देगा xऔर yउनके अंदर सब कुछ (यदि वे निर्देशिका हैं), लेकिन उनके माता-पिता या उनके बाहर कुछ भी नहीं।

रनिंग: sudo rm -R *.QTFSवर्तमान निर्देशिका और उसके बच्चों में सभी * .QTFS फ़ाइलों को हटा देगा, सही है?

नहीं, ये नामित सभी फाइलों को नष्ट करेगा *.QTFS, रिकर्सिवली किसी भी फाइल के अंदर निर्देशिका कहा जाता है *.QTFS, और उन निर्देशिकाओं के लिए खुद को। यदि आप चाहते हैं कि अन्य विलोपन व्यवहार, का उपयोग करें find -delete

वर्तमान निर्देशिका जिस रूप में प्रदर्शित होती है ls -lhaउसमें एक बेहतर शब्द की कमी के लिए लिंक .और ..लिंक होते हैं , इसलिए पुनरावृत्ति निर्देशिका ट्री में ऊपर की ओर इनका पालन क्यों नहीं करती है? वहाँ rm एप्लिकेशन पर एक कृत्रिम सीमा है, या .और ..वास्तविक चीजें नहीं हैं?

की एक कृत्रिम सीमा है rm

यह वास्तव में यह सब कृत्रिम नहीं है, हालांकि - यह एकमात्र तरीका है जो कभी भी काम कर सकता है। यदि rmमाता-पिता ..लिंक का अनुसरण करते हैं , तो सभी rm -rसिस्टम की हर फाइल को हटा देंगे, सभी ..लिंक का सभी तरह से पालन करके /। प्रत्येक निर्देशिका में और प्रविष्टियों को rmदेखता है जब वह सामग्री को सूचीबद्ध करता है, और उस कारण से स्पष्ट रूप से अवहेलना करता है।...

आप वास्तव में, खुद को आज़मा सकते हैं। स्पष्ट रूप से त्रुटि रिपोर्ट करते हुए, रन rm -r .और अधिकांश rmकार्यान्वयन कार्य करने से इंकार कर देंगे:

$ rm -r .
rm: refusing to remove ‘.’ or ‘..’ directory: skipping ‘.’

(वह संदेश GNU का हैrm ; अन्य समान हैं)। जब यह इन तर्कों को स्पष्ट तर्कों के बजाय स्पष्ट रूप से सामना करता है, तो यह उन्हें अनदेखा करता है और जारी रखता है। POSIX द्वारा उस व्यवहार की आवश्यकता है । जीएनयू rmऔर कई बीएसडी में, यह fts_readपदानुक्रम-ट्रैवर्सल कार्यों के परिवार द्वारा स्वचालित रूप से प्रदान किया जाता है ।

या .और ..वास्तविक चीजें नहीं हैं?

.और ..कर रहे हैं आम तौर पर , वास्तविक निर्देशिका प्रविष्टियों हालांकि उस फाइल सिस्टम-विशिष्ट है। वे लगभग हमेशा की तरह प्रस्तुत किए जाएंगे, हालांकि वे सभी उपयोगकर्ता कोड के लिए वास्तविक प्रविष्टियां हैं, भले ही। rmअपवाह या अवांछनीय पुनरावृत्ति को पकड़ने या रोकने के लिए सॉफ्टवेयर के कई टुकड़े (सिर्फ नहीं ) विशेष-उनके व्यवहार को।


प्रमाण मांगने वाले (या सीधे सादे इच्छुक) किसी के लिए, यह देखें कि यह GNU कोरुटिल्स में कैसे लागू किया जाता है
क्रिस हेस

@ChrisHayes समकक्ष gitweb लिंक उत्तर में है। वास्तविक पुनरावर्ती मामला fts_readकार्यान्वयन में है, हालांकि, यह केवल कमांड-लाइन तर्कों के लिए है।
माइकल होमर

@MichaelHomer ओह वाह, तो यह है। वह लिंक रंग इस SE योजना पर नहीं है । मेरी गलती।
क्रिस हेस

2
यह उत्तर सही है, लेकिन थोड़ा अड़चन भी है। rmयह भी नहीं देखता है *.QTFSक्योंकि यह आरएम बाइनरी लागू होने से पहले बैश द्वारा फिल्म्स में ग्लोब-विस्तारित है। @ tobyink के उत्तर पर ध्यान दें कि।
डेनिथ

एक विचारधारा के रूप में, उन .और ..विशेष-मामले के व्यवहार को डॉटफाइल्स अस्तित्व का कारण
mgarciaisaia

5

साथ ही माइकल होमर ने जो लिखा वह एक और कारक है जिससे गलती से मूल निर्देशिका में पुनरावृत्ति करना मुश्किल हो जाता है।

अपने होम डायरेक्टरी में जाएं और कुछ टाइप करें:

echo *s*

आप देखेंगे कि यह "s" अक्षर वाली फाइलों और निर्देशिकाओं की सूची दिखाता है। हालाँकि, प्रमुख डॉट से शुरू होने वाली कोई भी फाइल नहीं दिखाई गई है। उन्हें दिखाने के लिए, आप उपयोग कर सकते हैं:

echo .*s*

ऐसा इसलिए है क्योंकि शेल *एक प्रमुख बिंदु को शामिल करने के लिए विस्तार करने से इनकार करता है। इस का मतलब है कि:

rm -fr *

में पुनरावृत्ति नहीं होगी ..

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