यदि किसी फ़ाइल के पूर्वजों को उस निर्देशिका के रूप में परिभाषित किया गया है और उस निर्देशिका के पूर्वजों, यानी, एक निर्देशिका के वंशज उसकी प्रविष्टियाँ हैं और (उन प्रविष्टियों के लिए जो निर्देशिकाएँ हैं) उनके अपने वंशज हैं:
यह मानते हुए कि $f
एक नियमित फ़ाइल का पथ है (और एक प्रतीकात्मक लिंक का मार्ग नहीं है), आप इसके साथ "वास्तविक" निर्देशिका पा सकते हैं $(cd -- "$(dirname "$f")" && command -p pwd)
। इसी तरह, निर्देशिका का 'असली' स्थान खोजने के $d
साथ $(cd -- "$d" && command -p pwd)
। Bash / ksh / zsh में, आप command -p pwd
द्वारा प्रतिस्थापित कर सकते हैं pwd -P
।
यदि $f
यह एक प्रतीकात्मक लिंक हो सकता है, तो यह अधिक जटिल है। कुछ प्रणालियों में एक readlink
कमांड होती है, उदाहरण के लिए आप $(dirname "$(readlink -f -- "$f"))
हाल ही में जीएनयू कोरुटिल्स के साथ उपयोग कर सकते हैं , लेकिन ध्यान दें कि असंगत readlink
कमांड के साथ अन्य सिस्टम हैं या कोई भी नहीं है।
ध्यान दें कि फ़ाइल को आपके द्वारा जाँच के समय और परिणाम का उपयोग करने के समय के बीच स्थानांतरित किया जा सकता है। ऐसे कोने मामले भी हैं जहां प्रश्न का स्पष्ट हाँ / नहीं में कोई उत्तर नहीं होता है, जैसे कि जब निर्देशिका से फ़ाइल तक का मार्ग आरोह बिंदु को पार करता है।
यदि आप सभी जानना चाहते हैं कि कौन सी फाइलसिस्टम $f
चालू है, तो चलाएं df "$f"
।
यदि किसी निर्देशिका के वंशजों $d
को उन फाइलों के रूप में परिभाषित किया जाता है, जिन्हें उस रूप का नाम दिया जा सकता है, $d/x1/x2/.../xn
जहां निर्देशिका या प्रतीकात्मक संकेत हो सकते हैं:xi
इस संपत्ति के परीक्षण के लिए $d
सभी प्रतीकात्मक लिंक का अनुसरण करते हुए , पूरे निर्देशिका के पेड़ का एक चक्कर लगाना पड़ता है । निम्न कमांड को यह करना चाहिए (चेतावनी, सीधे ब्राउज़र में टाइप की गई, जीएनयू खोजने की आवश्यकता है):
[ -n "$(find -L "$d" -samefile "$f" -print -quit)" ]
यदि $f
हार्ड लिंक हैं, तो यह फ़ाइल $f
को किसी भिन्न नाम से एक्सेस कर सकता है । यदि आपको नाम के तहत फ़ाइल की आवश्यकता है $f
, तो यह अधिक जटिल हो जाता है; यहां एक प्रयास (फिर से, सीधे ब्राउज़र में टाइप किया गया; GNU खोजने और GNU grep की आवश्यकता है; फ़ाइल नामों में कोई नई सूची नहीं मानता):
f_directory="$(cd -- "$(dirname "$f")" && command -p pwd)"
f_truename="$f_directory/$(basename "$f")"
[ -n "$(find -L "$(cd "$d" && command -p pwd)" -exec readlink -f \; |
grep -F -q -x "$f_truename")" ]
कोई फर्क नहीं पड़ता कि आप क्या सही परिभाषा चुनते हैं, यह संपत्ति बहुत मजबूत नहीं है क्योंकि आप एक प्रतीकात्मक लिंक को गहराई से जोड़कर या हटाकर इसके मूल्य को बदल सकते हैं $d
।
/x/f
लेते हैं कि मेरी फ़ाइल है और मेरे पास एक सिमलिंक/y/sx
है/x
। मैं उपसर्ग नहीं होने के/y
बावजूद फ़ाइल से प्राप्त कर सकता हूं ।/y/
/x/f