क्या दो फाइलें हार्डलिंक हैं?


27

अगर कमांड लाइन से दो फाइलें हार्ड-लिंक्ड हैं तो मैं कैसे बता सकता हूं? जैसे कुछ लिंक यह:

$ ls
fileA fileB fileC

$ is-hardlinked fileA fileB
yes

$ is-hardlinked fileA fileC
no

जवाबों:


37

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

ऐश, ksh, bash और zsh में एक कंस्ट्रक्शन है जो आपके लिए चेक करता है: फाइल इक्वैलिटी ऑपरेटर -ef

[ fileA -ef fileB ] && ! [ fileA -ef fileC ]

अधिक उन्नत मामलों के लिए, ls -i /path/to/fileफ़ाइल की इनकोड संख्या सूचीबद्ध करता है। df -P /path/to/fileपता चलता है कि फाइल किस फाइल सिस्टम पर है (यदि दो फाइलें एक ही डायरेक्टरी में हैं, तो वे एक ही फाइल सिस्टम पर हैं)। यदि आपके सिस्टम में statकमांड है, तो यह संभवतः इनोड और फाइल सिस्टम नंबर दिखा सकता है ( statसिस्टम से सिस्टम में भिन्न होता है, अपने दस्तावेज की जांच करें)। यदि आप किसी निर्देशिका के अंदर हार्ड लिंक की त्वरित झलक चाहते हैं, तो प्रयास करें ls -i | sort(संभवतः जागने के लिए पाइप किया गया है )।

Few सभी मूल यूनिक्स फाइल सिस्टम, और कुछ अन्य जैसे NTFS, लेकिन संभवतः CramFS जैसे विदेशी मामले नहीं हैं।


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

4
ध्यान दें कि यदि fileA -ef fileBरिटर्न 0(सफलता) भी fileAहै fileB, तो इसके विपरीत, या वे दोनों एक ही फ़ाइल के लिए लिंक करते हैं।
जानमोसन

आप वास्तव में आपके द्वारा सुझाए गए आदेश को कैसे चलाते हैं? मैंने [.bashrc -ef .bash / .bashrc] और इस के रूपांतरों की कोशिश की, लेकिन यह वास्तव में काम नहीं किया।
चार्ली पार्कर

@CharlieParker [ .bashrc -ef .bash/.bashrc ]सही है। संदर्भ के बिना, निश्चित रूप से, मुझे नहीं पता कि यह "वास्तव में काम क्यों नहीं किया" - आप गलत फाइलों की तुलना कर सकते हैं, आप परिणाम की सही जांच नहीं कर सकते, आप बिना शेल का उपयोग कर सकते हैं -ef, ...
गिलेस 'एसओ- बुराई को रोकना'

2
@CharlieParker कमांड वास्तव में है [और इसका एक पर्याय है test। लेकिन man [या man testआपको बाहरी कमांड का मैन पेज देगा, जबकि बस हर शेल के बारे में थोड़ा अलग विकल्पों के साथ एक अंतर्निहित कमांड है, इसलिए आपको इसे अपने शेल के मैनुअल में देखना होगा।
गिल्स एसओ- बुराई को रोकें '

4
function is-hardlinked() {
    r=yes
    [ "`stat -c '%i' $1`" != "`stat -c '%i' $2`" ] && r=no
    echo $r
}

6
ध्यान दें कि यह एक गलत सकारात्मक हो सकता है अगर दोनों फाइलें अलग-अलग फाइल सिस्टम पर हों, लेकिन एक ही इनोड के साथ होती हैं। आपको डिवाइस नंबर का परीक्षण करने की आवश्यकता है ( stat -c %d)। और यदि आप लिनक्स पर हैं (आपकी statआज्ञा दी गई है ), तो आपके शेल में [ fileA -ef fileB ]सीधे यह सब करने की क्षमता है । इसके अलावा, आपका कमांड व्हाट्सएप युक्त फ़ाइल नामों के साथ टूट जाता है \[?*, या इसके साथ शुरू होता है -: हमेशा कमांड सुस्पिटिट्यूशंस ( "$(stat -c %i -- "$1")") के आसपास दोहरे उद्धरण लगाएं
गिल्स एसओ- बुराई को रोकना '

1
आप बोझिल लेकिन पोर्टेबल निर्माणों के एक समूह का उपयोग क्यों करेंगे, और फिर functionएक फ़ंक्शन नाम के साथ विशेष रूप से गैर-पोर्टेबल कीवर्ड जो (डैश युक्त होने के कारण) अनुमत नामों पर POSIX सम्मेलनों का उल्लंघन करता है?
चार्ल्स डफी

आप अपना $1और उद्धरण देना भूल गए $2। आप $()बैकटिक्स के बजाय सिंटैक्स का उपयोग करना चाह सकते हैं क्योंकि कोष्ठक यह स्पष्ट करते हैं कि कमांड कहां शुरू होता है और कहां समाप्त होता है और घोंसला बनाना सरल है।
josch

3

जैसा कि पहले पोस्टर का सुझाव है, आप लिनक्स पर कुछ इस तरह से एक स्क्रिप्ट लिख सकते हैं:

stat -c '%i' fileA fileB fileC

4
यह पर्याप्त नहीं है: यदि आप अलग-अलग फाइल सिस्टम पर हैं, तो दोनों फाइलों के लिए एक ही नंबर मिलेगा, लेकिन एक ही इनोड होने के लिए। आपको डिवाइस नंबर का परीक्षण करने की आवश्यकता है ( stat -c %d)। और यदि आप लिनक्स पर हैं (आपकी statआज्ञा दी गई है ), तो आपके शेल में [ fileA -ef fileB ]सीधे यह सब करने की क्षमता है ।
गिल्स एसओ- बुराई का होना बंद करें '

0

GNU find(1)संस्करण 4.2.11 या नए के साथ आप इसका उपयोग भी कर सकते हैं:

if [ "yes" = "$(find fileA -samefile fileB -exec echo yes \;)" ]; then
    echo yes
else
    echo no
fi

यदि fileAएक ही फाइल है fileBतो find"हां" प्रिंट कर देगा और स्थिति सही हो जाएगी।

फ़ाइल समानता ऑपरेटर का उपयोग करने के विपरीत -efयह एक नई प्रक्रिया को जन्म देगा।

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