क्या 'rm। *' कभी मूल निर्देशिका को हटाता है?


53

अभिव्यक्ति .*को वर्तमान और मूल निर्देशिका को शामिल करने के लिए बैश द्वारा विस्तारित किया जाता है:

$ ls -la
total 2600
drwxrwxrwx   2 terdon terdon 2162688 Sep 10 16:22 .
drwxr-xr-x 142 terdon terdon  491520 Sep 10 15:34 ..
-rw-r--r--   1 terdon terdon       0 Sep 10 16:22 foo
$ echo .*
. ..

अगर मैं चलाने rm -rf .*मेरी डेबियन का उपयोग कर जीएनयू बैश पर, version 4.2.36(1)-releaseऔर rmसे rm (GNU coreutils) 8.13, मैं यह संदेश प्राप्त:

$ rm -rf .*
rm: cannot remove directory: `.'
rm: cannot remove directory: `..'

क्या यह GNU है या यह POSIX है? क्या कोई भी * निक्स सिस्टम है जहाँ ऊपर का कमांड चुपचाप हटा देगा .और ..?

इसके अलावा, यह शेल या rmकमांड का ही एक सेफ्टी फीचर है?


4
मैं जानता हूँ कि इस सवाल के संदर्भ में है rm, लेकिन मैंने सोचा कि यह उल्लेख आप अभी भी साथ अवांछित परिणाम प्राप्त हो सकते हैं कि लायक था chmod, chown, आदि जब मिलान .*
हारून कोपले

जवाबों:


59

नवीनतम (2017) के रूप में के लिए POSIX कल्पना के संस्करण rmउपयोगिता है यहाँ (और पिछले एक वहाँ ) और का विलोपन मनाही .और ..

यदि किसी भी फाइल डॉट या डॉट-डॉट को किसी ऑपरेंड के बेसनमे भाग के रूप में निर्दिष्ट किया जाता है (जो कि, अंतिम पाथनाम घटक है) या यदि कोई ऑपरेंड रूट डाइरेक्टरी को हल करता है, तो rm एक डायग्नोस्टिक संदेश को मानक त्रुटि पर लिखेगा और कुछ भी नहीं करेगा इस तरह के ऑपरेंड के साथ।

जैसा कि @jlliagre ने कहा है, /SUSv4 में इसके अलावा हिस्सा है।

सबसे पुराना सार्वजनिक रूप से उपलब्ध यूनिक्स युक्ति जो मुझे मिल सकती है ( XPF4 CAE rev2 (1994)), पहले से ही निर्दिष्ट है .और ..इसे हटाया नहीं जा सकता है, हालांकि GNU फ़ाइलटाइल चेंगलॉग में टिप्पणी से पता चलता है कि यह पुराने POSIX में पहले से ही मौजूद था।

ध्यान दें कि यह करने के लिए लागू होता है dir/..और ../साथ ही साथ, लेकिन कुछ कार्यान्वयन (सोलारिस 11 और MacOS तरह यूनिक्स प्रमाणित भी शामिल होते हैं) अभी भी के खिलाफ की रक्षा नहीं करते rm -rf ../या rm -rf .*/)।

इतिहास

प्रारंभिक यूनियनों

यह -rविकल्प rmयूनिक्स V3 (1973) में जोड़ा गया था, हालांकि यह केवल निर्देशिकाओं की सामग्री को हटा रहा था, फिर भी आपको rmdirनिर्देशिकाओं को हटाने के लिए उपयोग करना होगा।

यह यूनिक्स V7 (1979, रिलीज में बदल गया, जिसमें बॉर्न शेल भी शामिल था और जिसमें से अधिकांश यूनिकस निकलते हैं)। rm -rअब निर्देशिका को भी हटा दिया है और ..निर्देशिका पेड़ को नहीं हटाया जाएगा । आदमी पेज कहता है:

..अनजाने में कुछ ऐसा करने के असामाजिक परिणामों से बचने के लिए केवल फ़ाइल को निकालना मना है rm -r .*

(हालांकि कोई यह तर्क दे सकता है कि rm -r .*यह अभी भी असामाजिक है क्योंकि यह सब कुछ हटा देता है क्योंकि .इसमें शामिल है)।

यह अभी भी हटाने को स्वीकार करता है, .हालांकि यह .या ..प्रविष्टियों को अनलिंक नहीं करेगा । तो, rm -r .वर्तमान निर्देशिका को खाली करने का एक प्रभावी तरीका था।

यह भी ध्यान दें कि सुरक्षा केवल शाब्दिक ..तर्क के लिए थी, dir/..या नहीं के लिए ./..। इसलिए, rm -rf ./.*अभी भी मूल निर्देशिका में सब कुछ हटा देगा।

यह देखना दिलचस्प है कि यह पहले से ही बग / मिसफिट को हल करने के लिए था जिसके द्वारा ग्लोब को शामिल किया जा सकता है .और ..उनके विस्तार में। यह 80 के दशक के उत्तरार्ध में फोर्सिथ शेल (मूल मिनिक्स शेल और पीडीएक्स के लिए आधार) में तय किया गया था, zshऔर fish(2005) लेकिन अन्य गोले नहीं थे और विशेष रूप से पोसिक्स shभाषा .*में शामिल करने के लिए .और ..यदि आवश्यक नहीं है वे द्वारा दिया जाता है readdir()( bashकेवल के साथ आंशिक रूप से समस्या को संबोधित करता shopt -s dotglobglobs (जहां .xxxवाले) को शामिल नहीं करते .या .., और साथ ksh, आप इसे करने से ठीक कर सकते हैं FIGNORE='@(.|..)')।

जब बिल्कुल मना .किया गया और साथ ही जोड़ा गया तो हमेशा स्पष्ट नहीं होता है और प्रत्येक यूनिक्स के साथ बदलता रहता है। नीचे कुछ निष्कर्ष।

BSDs

.2.9BSD (1983) और 2.10BSD (1987) के बीच और 4.2BSD (1983) और 4.3BSD (1986) के बीच कुछ समय के लिए मना किया गया था ( इस परिवर्तन को यूनिक्स-इतिहास-रेपो में 1985 देखें )।

$ wget -qO- http://www.tuhs.org/Archive/PDP-11/Distributions/ucb/2.9BSD/root.tar.gz |
    zgrep -ao 'rm: canno[[:print:]]*'
rm: cannot remove `..'
$ wget -qO- http://www.tuhs.org/Archive/PDP-11/Distributions/ucb/2.10bsd.tar.gz |
    zgrep -ao 'rm: canno[[:print:]]*'
rm: cannot remove `.' or `..'
rm: cannot remove `.' or `..'\n");

के लिए dir/.और dir/.., देखने के लिए 1988 में इस परिवर्तन (BSD 4.3 नेट / 1)।

इस तिथि तक, rmFreeBSD (और macOS की तरह व्युत्पन्न) अभी भी चालू या मूल निर्देशिका को ( rm -rf ./या उसके rm -rf ../लिए मायने रखता है rm -rf .*/) खाली कर देता है ।

सिस्टम वी

मेरे पास ज्यादा जानकारी नहीं है क्योंकि V7 के बाद AT & T Unix डेरिवेटिव के लिए न तो स्रोत या बाइनरी सार्वजनिक रूप से उपलब्ध हैं। अपने ऑनलाइन मैनुअल में, एचपीयूसी (सिस्टम III पर आधारित) में अभी भी उल्लेख है कि यह केवल मना करता है ..जबकि प्रभावी रूप से यह दोनों को मना करता है जो कि एक संकेत है कि शायद कम से कम SysIII ने हटाने को मना नहीं किया .( संपादित करें : अब SshIII rmस्रोत कोड को देख रहा है , यह है) लगभग यूनिक्स V7 के बाद अपरिवर्तित)।

अन्य सभी ऑनलाइन मैनुअल जिनका मैंने उल्लेख किया है हटाने .या ..निषिद्ध है जो कि POSIX अनुरूप होने की उम्मीद है।

सोलारिस rmअभी भी वर्तमान या मूल निर्देशिका को खाली करता है rm -rf ./या rm -rf ../

जीएनयू

जीएनयू fileutils के लिए जल्दी बदलाव का सभी ऐतिहासिक जानकारी नहीं है।

जबकि मूल रूप से न तो हटाने .या ..मना किया ..गया था , पहले मना किया गया था और फिर दोनों (शामिल dir/.), सभी 1990 और 1991 के बीच।

अन्य

जैसा कि हमने देखा, में zsh, .*(या किसी ग्लोब) का विस्तार कभी भी शामिल नहीं है .या ..(यहां तक ​​कि shअनुकरण मोड में भी )। rmनिर्मित (जो आप अगर तुम मिल zmodload zsh/files) इसलिए इलाज नहीं है .या ..विशेष रूप से। तो, उस zshबिलिन के साथ , आप खाली या rm -rf .या कर सकते हैं , लेकिन हटाएंगे या नहीं ।rm -rf .....rm -rf .*...

बिजीबॉक्स में rm, हटाने की मनाही .और ..0.52 (2001) में जोड़ा गया था


अजीब, कि है कि निर्दिष्ट करने के लिए लगता है rm -rf . /(अंतरिक्ष ध्यान दें) दो चेतावनी (के लिए प्रिंट चाहिए .और /) और बाहर निकलें, लेकिन हम एक सवाल यह है कि हर दो महीने कि से उबरने के लिए पूछ पाने के लिए लग रहे हैं।
केविन

6
@ केविन सभी सिस्टम POSIX के अनुरूप नहीं हैं और रूट निर्देशिका प्रतिबंध केवल स्पष्ट रूप से नवीनतम POSIX रिलीज़ में जोड़ा गया है।
jlliagre

@jlliagre मैं देख रहा हूं। जीएनयू आमतौर पर पोसिक्स (+ एक्सटेंशन) को लागू करने की कोशिश करता है, और मुझे लगता है कि वे इसे एक में लाना चाहते हैं, लेकिन अगर यह काफी नया है जो इसे समझाएगा।
केविन

2
@ स्टीफन: आप सही कह रहे हैं, लेकिन मैं अभी भी आपके जवाब की शुरुआत में एक बड़ा "हां, यह हो सकता है! लेकिन ..." जोड़ देगा, ताकि लोग निस्संदेह जानते हों कि वास्तव में, कुछ (पुराने या सिर्फ गैर पर) -पिक्स कंप्लेंट) सिस्टम, वे मूल निर्देशिका को हटा सकते हैं। मैं हमेशा उन संभावनाओं को इंगित करने की कोशिश करता हूं (यानी, मैं सुरक्षित पक्ष पर रहने की कोशिश करता हूं, भले ही यह जवाब कभी-कभी पढ़ने / याद करने के लिए कठिन बना देता है) ^ ^
ओलिवियर दुलैक

1
@ मार्टिनस्क्रोडर, बीएसडीएस पर, इसे 2.8BSD और 2.10BSD (केवल पहले .. "" यूनिक्सवी 7 की तरह मना किया गया) और 3BSD और 4.3RENO के बीच कहीं जोड़ा गया था। SysV सिस्टम पर, यह कम स्पष्ट है। उदाहरण के लिए एचपीयूएक्स मैनुअल का दावा है कि यह केवल "" .. "लेकिन प्रभाव में यह दोनों" को मना करता है। और "..", यह केवल मैनुअल है जो अप टू डेट नहीं है।
स्टीफन चेजलस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.