हार्ड लिंक को डीफेर करना


22

tarकमांड के मैनुअल पेज में , हार्ड लिंक का अनुसरण करने का विकल्प सूचीबद्ध है।

-h, --dereference
      follow symlinks; archive and dump the files they point to

--hard-dereference
      follow hard links; archive and dump the files they refer to

कैसे tarपता चलेगा कि एक फ़ाइल एक कड़ी है? इसका पालन कैसे करता है?

यदि मैं यह विकल्प नहीं चुनता तो क्या होगा? कैसे यह करता है नहीं कड़ी मेहनत से भिन्नता?

जवाबों:


24

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

यदि आप --hard-dereferenceविकल्प का उपयोग करते हैं , तो हार्ड लिंक को संरक्षित नहींtar करता है । इसके बजाय, यह उन्हें स्वतंत्र फ़ाइलों के रूप में मानता है जो केवल उसी सामग्री और मेटाडेटा के लिए होती हैं। जब आप संग्रह को निकालते हैं, तो फाइलें स्वतंत्र होंगी।

नोट: यह फ़ाइल के लिंक काउंट को पहले जाँच कर हार्ड लिंक को पहचानता है। यह एक से अधिक लिंक के साथ प्रत्येक फ़ाइल के डिवाइस नंबर और इनकोड को रिकॉर्ड करता है, और इसका उपयोग यह पता लगाने के लिए करता है कि उसी फ़ाइल को फिर से संग्रहीत किया जा रहा है या नहीं। (जब आप उपयोग करते हैं --hard-dereference, तो यह ऐसा नहीं करता है।)


7

आप एक फ़ाइल को हार्ड लिंक से अलग कर सकते हैं और इसे "लिंक काउंट" के साथ एक गैर-हार्ड-लिंक फ़ाइल से अलग कर सकते हैं। मैं कमांड लाइन से इसे प्राप्त करने के दो तरीके देखता हूं:

% stat original
  File: ‘original’
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 804h/2052d      Inode: 932815      Links: 2
Access: (0644/-rw-r--r--)  Uid: (  500/ bediger)   Gid: ( 1000/ bediger)
Access: 2012-07-13 22:13:52.317101530 -0600
Modify: 2012-07-13 22:13:52.317101530 -0600
Change: 2012-07-13 22:14:08.050894536 -0600
 Birth: -

या

1010 % ls -li 
total 0
932815 -rw-r--r-- 2 bediger bediger 0 Jul 13 22:13 original
932815 -rw-r--r-- 2 bediger bediger 0 Jul 13 22:13 secondary

"शयनकक्ष" से पहले 'अकेला' लिंक लिंक है। ध्यान दें कि दोनों फाइलनाम में एक ही इनकोड संख्या, 932815 है।

मुझे यकीन है कि इन दोनों कमांडों को स्ट्रक्च स्टैनल के st_nlink फील्ड से लिंक काउंट मिलता है, जो stat()सिस्टम कॉल से भर जाता है ।

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


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

2
यह "दो समान फ़ाइलें" नहीं है, यह दो नामों वाली एक फ़ाइल है। इससे कोई फर्क नहीं पड़ता कि कौन सी फ़ाइल टार आर्काइव नहीं करती है, क्योंकि वे समान हैं। डिफ़ॉल्ट रूप से, टार शायद किसी तरह का "पॉइंटर" किसी दूसरे फाइलनेम से पहले वैसे भी रखता है, जैसे कि फाइलसिस्टम करता है।
ब्रूस एडगर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.