यह निर्धारित करना कि क्या कोई फ़ाइल एक कड़ी या प्रतीकात्मक लिंक है?


51

मैं एक शेल स्क्रिप्ट बना रहा हूं जो फ़ाइल का फ़ाइल नाम / पथ लेगा और यह निर्धारित करेगा कि फ़ाइल एक प्रतीकात्मक लिंक या हार्ड लिंक है या नहीं।

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

इसके अलावा, मैं एक प्रतीकात्मक लिंक के गंतव्य विभाजन को कैसे खोजूंगा? तो मान लें कि मेरे पास एक फाइल है जो एक अलग पार्टीशन से लिंक है, मैं उस मूल फाइल का रास्ता कैसे खोजूंगा?


16
कड़ी कड़ी से आपका क्या मतलब है? सभी फाइलें हार्ड लिंक हैं।
terdon

1
@terdon ln /foo/bar/ /foo/bar2एक हार्डलिंक बनाता है, जबकि ln -s /foo/bar /foo/bar2एक सिमलिंक बनाता है, अर्थात उसका क्या मतलब है?
डिस्प्लेनैम

14
@DisplayName हाँ, लेकिन सभी फ़ाइलें उनके इनोड के लिए कड़ी हैं। कि लिनक्स फाइल सिस्टम कैसे काम करता है। आपके उदाहरण में, bar2और barदोनों कठिन लिंक हैं, बस एक ही इनोड की ओर इशारा करते हैं।
terdon

10
@DisplayName हाँ, वे अन्य के लिए कड़ी मेहनत कर रहे हैं लिंक inodes । यहां कोई विरोधाभास नहीं है। एक फाइल इनकोड का लिंक है। यह एक फ़ाइल की परिभाषा है। आपके मामले में, आपके पास अलग-अलग स्थानों पर ये लिंक हैं लेकिन यह अंतर्निहित डेटा संरचना को नहीं बदलता है। मेरा कहना यह है कि दोनों समान हैं barऔर bar2समान रूप से महत्वपूर्ण हैं। एक दूसरे के लिए लिंक नहीं है, वे दोनों लिंक हैं लेकिन एक ही इनोड की ओर इशारा करते हैं।
terdon

3
@ नहीं, मैं कह रहा हूं कि नियमित फाइलें हार्डलिंक हैं और इसके द्वारा बनाए गए हार्डलिंक lnनियमित फाइलों से अलग नहीं हैं।
terdon

जवाबों:


42

का उपयोग करके: जिम का जवाब एक सिमलिंक के लिए परीक्षण का तरीका बताता है test's -Lपरीक्षण।

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

शुक्र है, statकमांड, जहां उपलब्ध है, आपको बता सकता है कि कितने नामों में एक इनोड है।

तो आप कुछ इस तरह की तलाश कर रहे हैं (यहाँ GNU या बिजीबॉक्स कार्यान्वयन को मानकर stat):

if [ "$(stat -c %h -- "$file")" -gt 1 ]; then
    echo "File has more than one name."
fi

-c '%h'थोड़ी जानकारी देता है statसिर्फ inode को hardlinks की संख्या उत्पादन, यानी, नाम फ़ाइल है की संख्या के लिए। -gt 1फिर जांचता है कि क्या यह 1 से अधिक है।

ध्यान दें कि सिमिलिंक, किसी भी अन्य फ़ाइलों की तरह, कई निर्देशिकाओं से भी जुड़ा हो सकता है ताकि आपके पास एक सिमलिंक के लिए कई हार्डलिंक हो सकें।


ठीक है, बस स्पष्ट होने के लिए, मैं उन हार्डलिंक्स की संख्या को आउटपुट कर सकता हूं, जो फ़ाइल स्टेट कमांड का उपयोग कर रही है और यदि इसकी अधिक से अधिक 1 है, तो इसमें विभाजन पर कहीं और एक फ़ाइल जुड़ी हुई है।
के-रॉकर

@ के-रॉकर हां। तब विभाजन पर इसका कहीं दूसरा नाम होता है।
derobert

1
ओएस एक्स या * बीएसडी पर, यह stat -f %l /path/to/filegstat -c %h /path/to/fileयदि आप GNU कोरूटिल्स को उनके डिफ़ॉल्ट नामों (OS X पर Homebrew के साथ) के बिना भी उपयोग कर सकते हैं ।
GDP 2

29

एक उदाहरण:

$ touch f1
$ ln f1 f2
$ ln f1 f3
$ ln -s f1 s1
$ ln -s f2 s2
$ ln -s ./././f3 s3
$ ln -s s3 s4
$ ln s4 s5
$ ls -li
total 0
10802124 -rw-r--r-- 3 stephane stephane 0 Nov 12 19:55 f1
10802124 -rw-r--r-- 3 stephane stephane 0 Nov 12 19:55 f2
10802124 -rw-r--r-- 3 stephane stephane 0 Nov 12 19:55 f3
10802345 lrwxrwxrwx 1 stephane stephane 2 Nov 12 19:56 s1 -> f1
10802346 lrwxrwxrwx 1 stephane stephane 2 Nov 12 19:56 s2 -> f2
10802347 lrwxrwxrwx 1 stephane stephane 8 Nov 12 19:56 s3 -> ./././f3
10802384 lrwxrwxrwx 2 stephane stephane 2 Nov 12 19:56 s4 -> s3
10802384 lrwxrwxrwx 2 stephane stephane 2 Nov 12 19:56 s5 -> s3

f1, f2और f3निर्देशिका प्रविष्टियों एक ही फाइल (समान inode: 10,802,124, आप की संख्या पर ध्यान देंगे कर रहे हैं लिंक 3) है। वे एक ही नियमित फ़ाइल के लिए हार्ड लिंक हैं ।

s4और s5एक ही फाइल (10802384) भी हैं। वे नियमित रूप से नहीं, टाइप सिम्कलिन के हैं । वे यहां एक रास्ते की ओर इशारा करते हैं । क्योंकि और एक ही डायरेक्टरी की प्रविष्टियाँ हैं, दोनों के लिए एक ही फ़ाइल (इनोड 10802347 के साथ एक) के सापेक्ष पथ बिंदु।s3s4s5s3

यदि आप एक ऐसा करते हैं ls -Ll, जो कि सिम्बलिंक को हल करने के बाद फाइल की जानकारी प्राप्त करने के लिए कह रहा है:

$ ls -lLi
total 0
10802124 -rw-r--r-- 3 stephane stephane 0 Nov 12 19:55 f1
10802124 -rw-r--r-- 3 stephane stephane 0 Nov 12 19:55 f2
10802124 -rw-r--r-- 3 stephane stephane 0 Nov 12 19:55 f3
10802124 -rw-r--r-- 3 stephane stephane 0 Nov 12 19:55 s1
10802124 -rw-r--r-- 3 stephane stephane 0 Nov 12 19:55 s2
10802124 -rw-r--r-- 3 stephane stephane 0 Nov 12 19:55 s3
10802124 -rw-r--r-- 3 stephane stephane 0 Nov 12 19:55 s4
10802124 -rw-r--r-- 3 stephane stephane 0 Nov 12 19:55 s5

आप पाएंगे कि वे सभी एक ही फ़ाइल (10802124) के लिए हल हैं

आप देख सकते हैं कि कोई फ़ाइल किसके साथ एक सिमलिंक है [ -L file ]। इसी तरह, यदि आप एक फ़ाइल के साथ एक नियमित फ़ाइल है, तो आप परीक्षण कर सकते हैं [ -f file ], लेकिन उस स्थिति में, चेक सिम्बलिंक्स को हल करने के बाद किया जाता है।

हार्डलिंक एक प्रकार की फ़ाइल नहीं है, वे फ़ाइल के किसी भी प्रकार (किसी भी प्रकार के) के लिए अलग-अलग नाम हैं।


19

कमांड के ऑपरेटरों -hऔर -Lऑपरेटरों का उपयोग करना test:

-h file 
true if file is a symbolic link

-L file 
true if file is a symbolic link

http://www.mkssoftware.com/docs/man1/test.1.asp

इस SO थ्रेड के अनुसार , उनका व्यवहार समान है, लेकिन उन्हें -Lपसंद किया जाता है।


ठीक है, लेकिन मुश्किल लिंक के बारे में क्या? मैं चलने की जाँच की, लेकिन कड़ी के बारे में कुछ भी नहीं। यदि -L गलत है, तो क्या इसका मतलब कड़ी है? या सिर्फ एक नियमित फ़ाइल?
के-रॉकर

1
हार्ड लिंक एक ही साझा करें inode। इसके अलावा, सॉफ्ट लिंक lइसके ls -lआउटपुट की शुरुआत में दिखाते हैं ... मुझे लगता है कि आप उन नियमों को एक स्क्रिप्ट में एक साथ रखने में सक्षम हो सकते हैं, साथ ही [[ -L file ]]यह देखने के लिए कि क्या दी गई फ़ाइल नरम है या कठिन है , परीक्षण करें ।
जिमी-सीएल

ठीक है, भी, मैं प्रतीकात्मक लिंक के गंतव्य विभाजन को कैसे खोजूंगा?
के-रॉकर

3

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

यदि आप यह सब पढ़ रहे हैं और आपको पता चल गया है कि क्या चल रहा है, तो आप अच्छे हैं; आपको मेरे छोटे से पढ़ने की जरूरत नहीं है। यदि आप अभी भी भ्रमित हैं, तो चलते रहें।

वास्तव में बहुत कम जवाब है कि एक कड़ी कड़ी वास्तव में एक कड़ी नहीं है, जिस तरह से एक प्रतीकात्मक लिंक नहीं है। यह निर्देशिका संरचना में एक नई प्रविष्टि है जो बाइट्स के उसी समूह को इंगित करता है जिसे मूल निर्देशिका प्रविष्टि ने किया था, और एक बार जब आप इसे बना लेते हैं, तो यह पहले के रूप में 'वास्तविक' और वैध है। आपकी ड्राइव की प्रत्येक 'सामान्य' फ़ाइल में कम से कम एक कड़ी है; इसके बिना, आप इसे किसी भी में नहीं देखेंगेनिर्देशिका, और इसे संदर्भित करने या इसका उपयोग करने में असमर्थ होगा। इसलिए यदि आपके पास एक फ़ाइल Fred.txt है, और आप इसके लिए Wilma.txt और Barney.txt को कड़ी से कड़ी करते हैं, तो तीनों नाम (और निर्देशिका प्रविष्टियाँ) एक ही फ़ाइल को संदर्भित करते हैं, और वे सभी समान रूप से मान्य हैं। OS के लिए यह बताने का कोई तरीका नहीं है कि आपके टेक्स्ट एडिटर में "सेव" हिट करने पर एक एंट्री बनाई गई थी, और अन्य "ln" कमांड से बनाए गए थे।

OS को इस बात पर नज़र रखनी होगी कि एक ही फ़ाइल में कितनी अलग-अलग प्रविष्टियाँ इंगित कर रही हैं। यदि आप Wilma.txt को हटाते हैं, तो कोई आश्चर्य नहीं कि आप अपने ड्राइव पर कोई स्थान खाली नहीं करते हैं। लेकिन अगर आप फ्रेडटेक्स्ट ('ओरिजिनल' फाइल) को डिलीट कर देते हैं, तो भी आप अपनी ड्राइव पर कोई जगह खाली नहीं करेंगे, क्योंकि फ्रेड के नाम से जानी जाने वाली ड्राइव का डेटा अभी भी Barney.txt है। केवल जब आप सभी निर्देशिका प्रविष्टियों को हटाते हैं , तो OS उस स्थान को आवंटित करेगा, जो डेटा स्वयं कैप्चर कर रहा था।

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

[यह दो साल बाद है, और उस आखिरी बिट ने मुझे एक मिनट के लिए भ्रमित किया , इसलिए मुझे लगता है कि मैं स्पष्ट कर दूंगा। यदि आप "mv ./Wilma.txt ../elsewhere/Betty.txt" टाइप करते हैं, तो ऐसा लगता है कि आप फ़ाइल ले जा रहे हैं, लेकिन वास्तव में, आप नहीं हैं। आप वास्तव में जो कर रहे हैं वह आपकी वर्तमान निर्देशिका की निर्देशिका सूची से एक पंक्ति वस्तु निकाल रहा है, जो कहता है कि "विल्मा.टेक्स्ट" नाम उस डेटा से जुड़ा है जिसे इनोड ###### का उपयोग करके पाया जा सकता है #, "और निर्देशिका की निर्देशिका सूची में एक नई पंक्ति वस्तु जोड़ रहा है .. जो कहती है कि" "बेट्टी.टेक्स्ट" नाम उस डेटा के साथ जुड़ा हुआ है जिसे इनोड ####### के माध्यम से पाया जा सकता है। यही कारण है कि आप एक 2 गीगाबाइट फ़ाइल को '2 किलोबाइट फ़ाइल' के रूप में जल्दी से स्थानांतरित कर सकते हैं, जब तक आप उन्हें उसी ड्राइव पर किसी अन्य स्थान पर ले जा रहे हों।]

क्योंकि OS को इस बात पर नज़र रखनी है कि एक ही डेटा के कितने अलग-अलग निर्देशिका प्रविष्टियाँ इंगित कर रहे हैं, आप बता सकते हैं कि क्या किसी विशेष फ़ाइल को हार्ड लिंक से जोड़ा गया है, भले ही आप निश्चित रूप से यह नहीं बता सकते हैं कि निर्देशिका प्रविष्टि है या नहीं 'देख रहा है' मूल 'एक या नहीं है। एक तरीका है "ls" कमांड, विशेष रूप से "ls -l" (यह डैश के बाद एक लो-केस L है)

पहले का उदाहरण उधार लेने के लिए ...।

 -rw-r--r-- 3 stephane stephane 0 Nov 12 19:55 f1

पहले अक्षर का पानी का छींटा, इसलिए यह एक निर्देशिका या कुछ और विदेशी नहीं है, यह एक 'नियमित' साधारण फ़ाइल है। लेकिन अगर यह वास्तव में सामान्य था, तो rwx-ish भाग के बाद की संख्या "1" होगी, जैसा कि, "डेटा के इस ब्लॉक की ओर इशारा करते हुए एक निर्देशिका प्रविष्टि है।" लेकिन यह कठिन लिंक के प्रदर्शन का हिस्सा है, इसलिए इसके बजाय यह "3" कहता है।

ध्यान दें कि यह संभवतः अजीब और रहस्यमय व्यवहार का कारण बन सकता है (यदि आपने अपने सिर को कड़ी से कड़ी के चारों ओर लपेट नहीं किया है, तो)। यदि आप अपने टेक्स्ट एडिटर में Fred.txt खोलते हैं और कुछ बदलाव करते हैं, तो क्या आप Wilma.txt और Barney.txt में समान बदलाव देखेंगे? शायद। शायद। यदि आपका पाठ संपादक मूल फ़ाइल को खोलकर और उसमें परिवर्तन लिखकर परिवर्तनों को सहेजता है, तो हाँ, तीनों नाम अभी भी उसी (नए परिवर्तित) पाठ की ओर इशारा करेंगे। लेकिन अगर आपका टेक्स्ट एडिटर एक नई फ़ाइल बनाता है (फ्रेड-न्यू-टेम्पे.टैक्स), तो आपका बदला हुआ संस्करण उस पर लिखता है, फिर फ्रेडटेक्स्ट को डिलीट कर देता है, फिर फ्रेड-न्यू-टेम्प्लेट का नाम बदलकर फ्रेड.टैक्स, विल्मा और बार्नी करेगा अभी भी मूल संस्करण की ओर संकेत किया जा रहा है, न कि नया परिवर्तित संस्करण। यदि आप कठिन लिंक नहीं समझते हैं, तो यह आपको थोड़ा पागल बना सकता है। :) [ठीक है, मैं वास्तव में व्यक्तिगत रूप से किसी का नहीं जानतापाठ संपादक जो नई फ़ाइल / नाम बदलने का काम करेंगे, लेकिन मुझे बहुत सारे अन्य कार्यक्रमों के बारे में पता है जो वास्तव में ऐसा करते हैं, इसलिए सतर्क रहें।]

एक अंतिम नोट: 'fsck' (फाइल सिस्टम चेक) चेक के लिए एक चीज यह है कि क्या आपके ड्राइव पर डेटा के ब्लॉक हैं जो किसी भी तरह अब किसी भी निर्देशिका प्रविष्टियों द्वारा संदर्भित नहीं हैं। कभी-कभी कुछ गलत हो जाता है, और एकमात्र निर्देशिका प्रविष्टि जो एक इनोड को इंगित करती है हटा दी जाती है, लेकिन ड्राइव स्थान को "उपलब्ध" के रूप में चिह्नित नहीं किया जाता है। तो fsck में से एक काम सभी निर्देशिका प्रविष्टियों के साथ सभी आवंटित स्थान का मिलान करना है ताकि यह सुनिश्चित किया जा सके कि कोई अप्रतिबंधित फ़ाइलें नहीं हैं। यदि यह कुछ पाता है, तो यह नई निर्देशिका प्रविष्टियाँ बनाता है और उन्हें "खोया + पाया" में डालता है।


बस सोच रहा था, वे "अन्य कार्यक्रम जो वास्तव में ऐसा करते हैं" क्या हैं?
phk

@ एफके को नहीं पता कि वह विशेष रूप से क्या सोच रहा है, लेकिन यह एक सामान्य कार्य करने के लिए पर्याप्त दृष्टिकोण है जो एक लंबा समय ले सकता है और असफल होने पर आपको अनिश्चित स्थिति में छोड़ देगा। उदाहरण के लिए, यदि आप एक दूरस्थ सर्वर से डाउनलोड करने का प्रयास करते हैं, और आप जानते हैं कि एक मौका है कि सर्वर टाइमआउट हो सकता है, तो एक दृष्टिकोण एक टेम्प फाइल के लिए संपूर्ण सामग्री को डाउनलोड करना होगा। इस तरह अगर कुछ डाउनलोड के साथ गलत हो जाता है तो आपके पास अभी भी मूल फ़ाइल है।
21

केवल एक कार्यक्रम जिसे मैं निश्चित रूप से जानता हूं, वह है फ्रीहैंड, क्योंकि यदि / जब यह एक बचत के दौरान दुर्घटनाग्रस्त हो जाता है, तो एक अस्थायी फ़ाइल पीछे छोड़ दी जाती है, बजाय एक मूल फ़ाइल के। लेकिन मैंने अन्य कार्यक्रमों को भी करते देखा है; मैं इस समय आपको केवल विशिष्ट उदाहरण नहीं दे सकता।
स्नार्क

2

आप उपयोग कर सकते हैं readlink FILE; echo $?। यह 1 है जब यह एक हार्डलिंक और 0 होता है जब यह सिम्लिंक होता है।

मैन पेज से: "जब रीडलिंक के रूप में आमंत्रित किया जाता है, तो केवल प्रतीकात्मक लिंक का लक्ष्य मुद्रित किया जाता है। यदि दिए गए तर्क- मानसिक एक प्रतीकात्मक लिंक नहीं है, तो रीडलिंक कुछ भी नहीं प्रिंट करेगा और एक त्रुटि के साथ बाहर निकलेगा।"

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