अगर कमांड लाइन से दो फाइलें हार्ड-लिंक्ड हैं तो मैं कैसे बता सकता हूं? जैसे कुछ लिंक यह:
$ ls
fileA fileB fileC
$ is-hardlinked fileA fileB
yes
$ is-hardlinked fileA fileC
no
अगर कमांड लाइन से दो फाइलें हार्ड-लिंक्ड हैं तो मैं कैसे बता सकता हूं? जैसे कुछ लिंक यह:
$ ls
fileA fileB fileC
$ is-hardlinked fileA fileB
yes
$ is-hardlinked fileA fileC
no
जवाबों:
अधिकांश 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 जैसे विदेशी मामले नहीं हैं।
fileA -ef fileB
रिटर्न 0
(सफलता) भी fileA
है fileB
, तो इसके विपरीत, या वे दोनों एक ही फ़ाइल के लिए लिंक करते हैं।
[ .bashrc -ef .bash/.bashrc ]
सही है। संदर्भ के बिना, निश्चित रूप से, मुझे नहीं पता कि यह "वास्तव में काम क्यों नहीं किया" - आप गलत फाइलों की तुलना कर सकते हैं, आप परिणाम की सही जांच नहीं कर सकते, आप बिना शेल का उपयोग कर सकते हैं -ef
, ...
[
और इसका एक पर्याय है test
। लेकिन man [
या man test
आपको बाहरी कमांड का मैन पेज देगा, जबकि बस हर शेल के बारे में थोड़ा अलग विकल्पों के साथ एक अंतर्निहित कमांड है, इसलिए आपको इसे अपने शेल के मैनुअल में देखना होगा।
function is-hardlinked() {
r=yes
[ "`stat -c '%i' $1`" != "`stat -c '%i' $2`" ] && r=no
echo $r
}
stat -c %d
)। और यदि आप लिनक्स पर हैं (आपकी stat
आज्ञा दी गई है ), तो आपके शेल में [ fileA -ef fileB ]
सीधे यह सब करने की क्षमता है । इसके अलावा, आपका कमांड व्हाट्सएप युक्त फ़ाइल नामों के साथ टूट जाता है \[?*
, या इसके साथ शुरू होता है -
: हमेशा कमांड सुस्पिटिट्यूशंस ( "$(stat -c %i -- "$1")"
) के आसपास दोहरे उद्धरण लगाएं ।
function
एक फ़ंक्शन नाम के साथ विशेष रूप से गैर-पोर्टेबल कीवर्ड जो (डैश युक्त होने के कारण) अनुमत नामों पर POSIX सम्मेलनों का उल्लंघन करता है?
$1
और उद्धरण देना भूल गए $2
। आप $()
बैकटिक्स के बजाय सिंटैक्स का उपयोग करना चाह सकते हैं क्योंकि कोष्ठक यह स्पष्ट करते हैं कि कमांड कहां शुरू होता है और कहां समाप्त होता है और घोंसला बनाना सरल है।
जैसा कि पहले पोस्टर का सुझाव है, आप लिनक्स पर कुछ इस तरह से एक स्क्रिप्ट लिख सकते हैं:
stat -c '%i' fileA fileB fileC
stat -c %d
)। और यदि आप लिनक्स पर हैं (आपकी stat
आज्ञा दी गई है ), तो आपके शेल में [ fileA -ef fileB ]
सीधे यह सब करने की क्षमता है ।
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
यह एक नई प्रक्रिया को जन्म देगा।