क्या हार्ड लिंक सामान्य फ़ाइलों के रूप में गिना जाता है?


21

मैं सोच रहा था कि क्या यह रजिस्टर करने का कोई तरीका है, लेकिन चूंकि अधिकांश आधुनिक खोज इंजन लंबाई में लगभग 5 शब्दों के वाक्यांशों के साथ अच्छी तरह से काम नहीं करते हैं, मुझे इस पर कुछ मदद चाहिए।

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

इसके अलावा, अगर उन्हें नियमित फाइल माना जाता है, तो क्या यह जांचने का कोई तरीका है कि क्या ये फाइलें बिना पार्स किए कड़ी हैं ls -i? और यह जांचने का एक तरीका है कि क्या कुछ मनमानी फ़ाइल, एक्स, हार्ड find -iकमांड के उपयोग के बिना किसी अन्य मनमानी फ़ाइल, वाई से जुड़ी हुई है ?


5
हार्ड लिंक के साथ "X" वास्तव में "Y" से जुड़ा नहीं है। "X" और "Y" एक ही फाइल हैं।
जोर्डनम

6
एक निर्देशिका में सभी "नियमित फाइलें" हार्ड लिंक हैं। ऐसी कुछ फाइलें एक से अधिक हैं।
एंड्रयू हेनले

@AndrewHenle वाह, अच्छी बात है। यह ठीक उसी तरह की चीज है जिसकी मुझे तलाश थी, इसलिए धन्यवाद।
मि। मिन्टी फ्रेश

2
@ Mr.MintyFresh विशेष रूप से, प्रतीकात्मक लिंक के लिए "मूल" और "लिंक" के बीच कोई अंतर नहीं है।
रैंडम 832

जवाबों:


38

यूनिक्स-शैली प्रणालियों में, डेटा संरचना जो फाइल सिस्टम ऑब्जेक्ट्स का प्रतिनिधित्व करती है (दूसरे शब्दों में, फ़ाइल के बारे में डेटा ), जिसे "इनोड" कहा जाता है।

एक फ़ाइल नाम इस इनोड के लिए एक लिंक है, और इसे "हार्ड लिंक" के रूप में संदर्भित किया जाता है। पहले नाम एक फ़ाइल दी गई है और किसी भी बाद के लिंक के बीच कोई अंतर नहीं है। तो जवाब है, "हाँ": एक कड़ी एक नियमित फ़ाइल है और वास्तव में, एक नियमित फ़ाइल एक कड़ी है।

lsआदेश कितने हार्ड लिंक वहाँ फाइल करने के लिए कर रहे हैं तुम्हें दिखाता हूँ।

उदाहरण के लिए:

seumasmac@comp:~$ echo Hello > /tmp/hello.txt
seumasmac@comp:~$ ls -l /tmp/hello.txt 
-rw-rw-r-- 1 seumasmac seumasmac 6 Oct  4 13:05 /tmp/hello.txt

यहां हमने एक फाइल बनाई है, जिसका नाम है /tmp/hello.txt1से उत्पादन में ls -lइंगित करता है कि वहाँ इस फ़ाइल की 1 हार्ड लिंक। यह हार्ड लिंक फ़ाइल नाम ही है /tmp/hello.txt

यदि हम अब इस फाइल का एक और हार्ड लिंक बनाते हैं:

seumasmac@comp:~$ ln /tmp/hello.txt /tmp/helloagain.txt
seumasmac@comp:~$ ls -l /tmp/hello*
-rw-rw-r-- 2 seumasmac seumasmac 6 Oct  4 13:05 /tmp/helloagain.txt
-rw-rw-r-- 2 seumasmac seumasmac 6 Oct  4 13:05 /tmp/hello.txt

अब आप देख सकते हैं कि दोनों फ़ाइलनाम यह दर्शाते हैं कि फ़ाइल में 2 हार्ड लिंक हैं। इनमें से कोई भी "उचित" फ़ाइल नाम नहीं है, वे दोनों समान रूप से मान्य हैं। हम देख सकते हैं कि वे दोनों एक ही इनोड की ओर इशारा करते हैं (इस मामले में, 5374043):

seumasmac@comp:~$ ls -i /tmp/hello*
5374043 /tmp/helloagain.txt  5374043 /tmp/hello.txt

एक आम गलत धारणा है कि यह निर्देशिकाओं के लिए अलग है। मैंने लोगों को यह कहते हुए सुना है कि lsएक निर्देशिका के लिए दिए गए लिंक की संख्या उप-सीमाओं की संख्या है, जिसमें शामिल है .और ..जो गलत है । या, कम से कम, जबकि यह आपको सही संख्या देगा, यह गलत कारणों के लिए सही है!

यदि हम एक निर्देशिका बनाते हैं और ls -ldहम करते हैं:

seumasmac@comp:~$ mkdir /tmp/testdir
seumasmac@comp:~$ ls -ld /tmp/testdir
drwxrwxr-x 2 seumasmac seumasmac 4096 Oct  4 13:20 /tmp/testdir

इससे पता चलता है कि इस निर्देशिका की 2 कड़ी हैं। य़े हैं:

/tmp/testdir
/tmp/testdir/.

ध्यान दें कि /tmp/testdir/..यह इस निर्देशिका का लिंक नहीं है, यह एक लिंक है /tmp। और यह आपको बताता है कि "उपनिर्देशिकाओं की संख्या" क्यों काम करती है। जब हम एक नया उपनिर्देशिका बनाते हैं:

seumasmac@comp:~$ mkdir /tmp/testdir/dir2
seumasmac@comp:~$ ls -ld /tmp/testdir
drwxrwxr-x 3 seumasmac seumasmac 4096 Oct  4 13:24 /tmp/testdir

अब आप देख सकते हैं कि /tmp/testdirनिर्देशिका में 3 हार्ड लिंक हैं । य़े हैं:

/tmp/testdir
/tmp/testdir/.
/tmp/testdir/dir2/..

इसलिए हर नई उप-निर्देशिका में लिंक की गिनती एक-एक करके बढ़ जाएगी, क्योंकि ..इसमें प्रवेश होता है।


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

यह ठीक है, मुझे यकीन है कि यह किसी और के लिए उपयोगी जानकारी होगी।
२um

दिलचस्प संपादित करें dotglob हार्डलिंक सिस्टम के साथ, मुझे कभी नहीं पता था कि यह ऐसा करता है।
मि। मिन्टी फ्रेश

मैंने हार्ड लिंक == नियमित फ़ाइलों के पैरा को स्पष्ट किया।
सीसमैसैक

1
विशेष रूप से वाक्य की तरह: "इनमें से कोई भी 'उचित' फ़ाइल नाम नहीं है, वे दोनों समान रूप से मान्य हैं।" यह कठिन लिंक की समझ के लिए एक महत्वपूर्ण घटक है। बहुत अच्छा लिखा है।
वाइल्डकार्ड

4

क्या हार्ड लिंक सामान्य फ़ाइलों के रूप में गिना जाता है?

हार्ड लिंक गिनती के रूप में वे जो कुछ भी कर रहे हैं। आप एक ही फाइल सिस्टम पर कुछ भी लिंक कर सकते हैं।

mkdir test
cd !$

>file
ln -s file sym
mknod pipe p

ln file file2
ln -P sym sym2
ln pipe pipe2

ls -al

# sockets, too:
cat >tsock.c <<\EOD
#include <sys/socket.h>
#include <sys/un.h>
int main(int n, char **a)
{
        struct sockaddr_un test = { AF_UNIX, "socket" };
        int testfd = socket(AF_UNIX, SOCK_SEQPACKET, 0);
        bind(testfd,(struct sockaddr *)&test,sizeof test);
}
EOD
make tsock
./tsock

ln socket socket2

ls -al

# even devices if you want:
sudo mknod mytty c 5 0
ln mytty mytty2
sudo chmod 666 mytty

ls -al
# notice permissions are on an object not on the links to it:
echo Hi, Kilroy! >mytty2  

कुछ भी करने के लिए हर हार्डलिंक समतुल्य है, अंतर्निहित वस्तु इतनी देर तक चारों ओर चिपकती रहती है जब तक उसमें कोई भी (संपादित करें: गैर-प्रतीकात्मक) लिंक नहीं होता है (यहां तक ​​कि एक खुली फाइल डिस्क्रिप्टर, जिसके लिए मुझे बहुत शर्मनाक होने का शर्मनाक कारण है)।

सिस्टम निर्देशिका लिंक पर नियमों को लागू करेगा, आपको एक निर्देशिका के लिए एक नामित लिंक मिलता है और सिस्टम स्वचालित रूप से अपने एम्बेडेड .लिंक और किसी भी उपनिर्देशिका ..लिंक को जोड़ता है (नोटिस कि .एलएस के ऊपर दो लिंक हैं) लेकिन यह एक स्पष्ट जाँच है, कुछ modded पर सिस्टम उन उपयोगकर्ताओं को विशेषाधिकार देता है जो वादे करने का वादा करते हैं कि लूप नहीं बनाते हैं, वे स्वयं नए लिंक जोड़ सकते हैं। फाइलसिस्टम की परवाह नहीं है, यह सिर्फ ठीक से मनमाने निर्देशिका ग्राफ का प्रतिनिधित्व कर सकता है, लेकिन कोई भी उनसे निपटना नहीं चाहता है।

ऐसे बहुत सारे (गैर-यूनिक्स) फाइलसिस्टम हैं जो इस तरह से काम नहीं करते हैं, जिनमें से कुछ ऐसे हैं जो कॉल करते हैं कि वे "हार्ड लिंक" के विकल्प के रूप में क्या पेश करते हैं। ओएस एक्स ने एचएफएस + (जो उन्हें मूल रूप से नहीं है) पर एक समान रूप से जोड़ दिया है अगर मुझे सही ढंग से याद है, तो मुझे नहीं पता कि यह यहां के शब्दार्थ को कितनी ईमानदारी से संरक्षित करता है।


./tsockवास्तव में, वैसे भी क्या करता है?
mikeserv

@mikeserv यह मेक-इन-सॉकेट कार्यक्रम है, यह सिर्फ अपनी वर्तमान निर्देशिका में "सॉकेट" नामक एक सॉकेट लिंक को गिराता है।
jthill

ठीक है, लेकिन शायद मुझे यह स्पष्ट करना चाहिए कि मैं सॉकेट्स के बारे में कितना कम जानता हूं। मुझे लगता है कि मैं लिंक को अच्छी तरह से समझता हूं और इसलिए यह उसी सॉकेट को नया नाम देता है, है ना? कि सॉकेट या किसी भी चीज़ के लिए कोई विशेष महत्व नहीं है, हाँ? मेरी अज्ञानता पर खेद है।
मोकेसर

1
@mikeserv एक सॉकेट एक विशुद्ध रूप से रनटाइम इकाई है। socket()एक वास्तविक सॉकेट बनाता है, bind()इसे एक विशिष्ट नाम देता है, connect()आपके द्वारा बनाए गए सॉकेट को कुछ नामित सॉकेट से जोड़ता है। विभिन्न प्रकार के सॉकेट विभिन्न प्रकार के नामों का उपयोग करते हैं, जैसे इंटरनेट सॉकेट इंटरनेट पते का उपयोग करते हैं, लेकिन वे सभी साझा एपीआई (सहित read()और write(), यह मुझे दुखी करता है कि आप open()एक फाइल सिस्टम सॉकेट नहीं कर सकते हैं और आपके पास ओएस और लिबास socket()और आपके connect()लिए है) । man 7 socketअधिक है, सभी नेटवर्किंग प्रोटोकॉल एक फ़र्ज़ी मैन्पेज के लिए बनाते हैं।
jthill

1
@mikeserv देखें, मैं पीटी और पीटीएस जादू कर सकता हूं, और शायद एक अच्छे दिन पर भी ptmx, लेकिन यह इसके बारे में है। :-) कम से कम 5,0 नोड हर जगह काम करता है जो मुझे मिल सकता है, यह कंट्रोलिंग-ट्टी डिवाइस प्रकार है। मुझे यह सिर्फ ls -l / dev / tty के साथ मिला, लगता है कि मैं वहां भाग्यशाली हूं।
jthill
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.