फ़ोल्डर के लिए बनाए गए विशेष हार्डलिंक "।" को कैसे हटाया जाए?


29

लिनक्स पर, जब आप एक फ़ोल्डर बनाते हैं, तो यह स्वचालित रूप से संबंधित इनोड में दो हार्ड लिंक बनाता है । एक वह फ़ोल्डर है जिसे आपने बनाने के लिए कहा था, दूसरा .इस फ़ोल्डर का विशेष फ़ोल्डर।

उदाहरण:

$ mkdir folder
$ ls -li
total 0
124596048 drwxr-xr-x    2 fantattitude  staff    68 18 oct 16:52 folder
$ ls -lai folder
total 0
124596048 drwxr-xr-x  2 fantattitude  staff   68 18 oct 16:52 .
124593716 drwxr-xr-x  3 fantattitude  staff  102 18 oct 16:52 ..

आप देख सकते हैं, दोनों folderऔर .के अंदर folderएक ही आइनोड संख्या (के साथ दिखाया गया है -iविकल्प)।

क्या इस विशेष .हार्डलिंक को हटाने के लिए कुछ भी है ?

यह केवल प्रयोग और जिज्ञासा के लिए है। इसके अलावा, मुझे लगता है कि उत्तर ..विशेष फ़ाइल पर भी लागू हो सकता है ।

मैंने rmआदमी को देखने की कोशिश की, लेकिन ऐसा करने का कोई तरीका नहीं मिला। जब मैं .सभी को हटाने की कोशिश करता हूं तो मुझे यह मिलता है:

rm: "" और ".." नहीं हटाया जा सकता है

मैं पूरी तरह से इन चीजों के बारे में उत्सुक हूं कि ये चीजें काम करती हैं, इसलिए इस विषय पर बहुत क्रियात्मक होने से बचना नहीं चाहिए।

संपादित करें: शायद मैं अपनी पोस्ट के साथ स्पष्ट नहीं था, लेकिन मैं अंतर्निहित तंत्र को समझना चाहता हूं जो .फाइलों के लिए जिम्मेदार है और जिन कारणों से उन्हें हटाया नहीं जा सकता है।

मुझे पता है कि POSIX मानक 2 हार्डलिंक से कम वाले फ़ोल्डर को अस्वीकार कर देता है, लेकिन वास्तव में ऐसा क्यों नहीं होता है। मैं जानना चाहता हूं कि क्या ऐसा करना संभव हो सकता है।



@StephenKitt कृपया मेरा संपादन देखें।
Fantattitude

1
मैंने अपना वोट वापस ले लिया है, देखते हैं कि मतदान कैसे होता है ...
स्टीफन किट

2
दोनों को रिश्तेदार रास्तों की जरूरत होती है। आप इन्हें (सादे जिज्ञासा के अलावा) क्यों दूर करना चाहेंगे?
HalosGhost

@HalosGhost मैं बस बहुत उत्सुक हाहा रहा हूं, सिस्टम की सीमाओं की खोज और यह कैसे और क्यों इस तरह से डिजाइन किया गया था।
फंतासी

जवाबों:


46

तकनीकी रूप से इसे हटाना संभव है ., कम से कम EXT4 फाइल सिस्टम पर। आप में एक फाइल सिस्टम छवि बनाते हैं test.img, एक यह माउंट और बनाने testफ़ोल्डर, तो यह फिर से अनमाउंट, आप का उपयोग कर इसे संपादित कर सकते हैं debugfs:

debugfs -w test.img
cd test
unlink .

debugfsशिकायत नहीं करता है और .फ़ाइल सिस्टम में निर्देशिका प्रविष्टि को कर्तव्यपूर्वक हटा देता है । testनिर्देशिका अभी भी प्रयोग करने योग्य है, एक आश्चर्य के साथ:

sudo mount test.img /mnt/temp
cd /mnt/temp/test
ls

केवल दिखाता है

..

तो .वास्तव में चला गया है। फिर भी cd ., ls ., pwdअभी भी हमेशा की तरह व्यवहार करते हैं!

मैंने पहले इस परीक्षण का उपयोग किया था rmdir ., लेकिन यह निर्देशिका के इनोड को मिटा देता है ( इसे इंगित करने के लिए BowlOfRed के लिए बहुत बड़ा धन्यवाद ), जो एक झूलने वाली निर्देशिका प्रविष्टि को छोड़ देता है और सामने आने वाली समस्याओं का वास्तविक कारण है। इस परिदृश्य में, फ़ोल्डर तब अनुपयोगी हो जाता है; छवि को माउंट करने के बाद, रनिंग का उत्पादन होता हैtesttestls

ls: cannot access '/mnt/test': Structure needs cleaning

और कर्नेल लॉग दिखाता है

EXT4-fs error (device loop2): ext4_lookup:1606: inode #2: comm ls: deleted inode referenced: 38913

e2fsckछवि पर इस स्थिति में चलने से testनिर्देशिका को पूरी तरह से हटा दिया जाता है (निर्देशिका इनोड चला गया है ताकि पुनर्स्थापित करने के लिए कुछ भी नहीं है)।

यह सब दिखाता है कि .EXT4 फाइल सिस्टम में एक विशिष्ट इकाई के रूप में मौजूद है। मुझे कर्नेल में फाइलसिस्टम कोड से आभास हुआ कि यह अपेक्षा करता है .और ..मौजूद है, और चेतावनी देता है कि वे नहीं देखते (देखें namei.c), लेकिन unlink .-based परीक्षण के साथ मैंने वह चेतावनी नहीं देखी। e2fsckलापता .निर्देशिका प्रविष्टि पसंद नहीं है , और इसे ठीक करने की पेशकश करता है:

$ /sbin/e2fsck -f test.img
e2fsck 1.43.3 (04-Sep-2016)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Missing '.' in directory inode 30721.
Fix<y>?

यह .निर्देशिका प्रविष्टि को फिर से बनाता है ।


बहुत ही रोचक! धन्यवाद! तो .फ़ोल्डर वास्तव में FS के अंदर मौजूद है और उपकरण इसे ठीक से काम करने की उम्मीद करते हैं।
फंतासी

वास्तव में आप के लिए अच्छा है, मैं नहीं जानता कि लिनक्स और इसके एफएस को इस तरह के खुद को खोजने के लिए पर्याप्त है इसलिए मैं आपका बहुत आभारी हूं कि आप मुझे जवाब देने के लिए समय लेते हैं :)
फंतासिटी

3
क्या आप "rmdir" (जो वास्तव में इनकोड को हटाता है) को "अनलिंक" (जो केवल निर्देशिका प्रविष्टि को हटाता है) को बदलने का प्रयास कर सकते हैं। यह ज्यादातर कार्यशील निर्देशिका (पर mountया कोई त्रुटि नहीं ls) को छोड़ने के लिए प्रकट होता है । यदि अन्य समस्याएं उत्पन्न होती हैं तो मैंने नहीं देखा है।
बाउलऑफ्रेडेड

@BowlOfRed आपको बहुत बहुत धन्यवाद, यह एक बहुत अच्छी बात है - इसलिए मेरा rmdir .वास्तव में विनाशकारी testनिर्देशिका प्रविष्टि के रूप में नष्ट हो रहा था और छोड़ रहा था , जिससे आप मुद्दों का कारण बनेंगे। मैं unlinkअपने उत्तर के साथ जांच करूंगा और अपडेट करूंगा!
स्टीफन किट

1
@GiacomoCatenazzi सीधे नहीं, अनुमतियाँ और स्वामित्व इनोड में संग्रहीत हैं, निर्देशिका प्रविष्टि नहीं।
स्टीफन किट

5

इस निर्देशिका प्रविष्टि को हटाने का कोई तरीका नहीं है। .प्रवेश का अर्थ है "इस निर्देशिका", ..प्रवेश का अर्थ है "इस निर्देशिका के मूल निर्देशिका"। वे वास्तव में कठिन लिंक नहीं हैं, बस यही है कि निर्देशिका संरचना कैसे बनाई / प्रतिनिधित्व करती है।


मुझे इस बारे में पता है, मैं बस उत्सुक हूँ अगर यह संभव है क्योंकि वे हार्डलिंक लगते हैं। यदि वे नहीं हैं तो वे इनोड की हार्ड लिंक गिनती में क्यों जोड़ेंगे?
फंतासी

3
> वे वास्तव में कठिन लिंक नहीं हैं, बस यही है कि निर्देशिका संरचना कैसे बनाई / प्रतिनिधित्व करती है। इसके अलावा, नकल। unix.stackexchange.com/questions/289385/…
Xalorous

@ एक्सलोरस और तो क्या वास्तव में इन विशेष फ़ाइलों का प्रतिनिधित्व करता है, अगर वे हार्डलिंक नहीं हैं, तो वे क्या हैं? वे मौजूद हैं इसलिए उन्हें कहीं न कहीं होना चाहिए, सिवाय इसके कि अगर वे सिर्फ अपने आप lsया अन्य उपकरणों द्वारा दिखाए जाते हैं जो मुझे वास्तविक नहीं लगते हैं।
फनटच्यूड

@Fantattitude वे हैं कि कैसे फ़ोल्डर POSIX आवश्यकता को लागू करने के लिए खुद का प्रतिनिधित्व करता है जो rmdir PWD को हटाने में सक्षम नहीं है।
Xalorous

1
पारंपरिक यूनिक्स फाइल सिस्टम में वे वास्तविक हार्ड लिंक हैं। वे अन्य फाइल सिस्टम के लिए चालक द्वारा मक्खी पर संश्लेषित होते हैं।
बरमार

2

जैसा कि यूनिक्स 6 सोर्स कोड पर शेर के नोट्स में वर्णित हैप्रारंभिक यूनिक्स में एक डिस्क फ़ाइल थी जहां इनोड संरचनाओं द्वारा डिस्क पर फ़ाइलों और निर्देशिकाओं दोनों का प्रतिनिधित्व किया गया था। एक विशेष बिट था जो इंगित करता था कि फ़ाइल सामग्री एक निर्देशिका थी। प्रत्येक इनोड में अपने स्वयं के इनोड का लिंक होता था जो एक फाइल को यह जानने की अनुमति देता था कि वह किस निर्देशिका में है। अपवाद '/' निर्देशिका थी जो स्वयं की थी। सामग्री का लिंक भी था। यदि किसी इनोड में कोई सामग्री नहीं होती है तो उसे मुफ्त सूची में वापस किया जा सकता है। चूंकि एक निर्देशिका सिर्फ एक धन्य फ़ाइल थी, यहां तक ​​कि एक खाली निर्देशिका में भी कचरा इकट्ठा होने से बचाने के लिए सामग्री होनी चाहिए। इस प्रकार .. मूल इनोड और इनोड का लिंक था। वहाँ था इंगित करने के लिए निर्देशिका अभी भी प्रयोग करने योग्य था। rmdir (अनलिंक कॉल करके) को हटा सकता है।


0

जैसा कि 'पोस्ट ' के उत्तर का 'संभावित डुप्लिकेट' कहता है, पोसिक्स मानक निर्दिष्ट करता है कि यदि rmdir वर्तमान निर्देशिका को हटाने का प्रयास करता है, तो वह विफल हो जाएगा।

आपके द्वारा निर्मित किसी भी चीज़ के लिए आपके पास एक आधार होना चाहिए। 'यहां' कहने के तरीके के बिना रिश्तेदार रास्तों को परिभाषित करना कठिन है। ऐसा '।' 'यहाँ' के रूप में परिभाषित किया गया है।

इसके अलावा, आप 'डॉट' और 'डॉट डॉट' को हटा सकते हैं । अपना खुद का ओएस लिखें जो उन्हें परिभाषित नहीं करता है। हालांकि यूनिक्स (और एक्सटेंशन मैक ओएसएक्स), लिनक्स, और यहां तक ​​कि एमएस डॉस और विंडोज सभी डॉट और डॉटडॉट का उपयोग करते हैं।

टीएल; डीआर - 'डॉट' ओएस की परिभाषा में है।


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