शेल उपयोगिता यह जांचने के लिए कि निर्देशिका किसी फ़ाइल का पूर्वज है या नहीं


3

मैं कैसे जांच सकता हूं कि पथ की दी गई नियमित फ़ाइल पथ fकी निर्देशिका का वंशज है d। यदि सहानुभूति के लिए नहीं, तो मैं बस जांच करूंगा कि क्या d(अनुगामी स्लैश के साथ) उपसर्ग है f। अब सहानुभूति के साथ यह थोड़ा और अधिक जटिल हो जाता है, क्योंकि मैं पूर्वजों के भौतिक मार्गों को खोज सकता था fऔर उनमें से प्रत्येक की भौतिक पथ से तुलना कर सकता था d। हालाँकि, मेरा मानना ​​है कि इसके लिए उपयोगकर्ता की उपयोगिता हो सकती है, क्या कोई है?

जवाबों:


4
  1. यदि किसी फ़ाइल के पूर्वजों को उस निर्देशिका के रूप में परिभाषित किया गया है और उस निर्देशिका के पूर्वजों, यानी, एक निर्देशिका के वंशज उसकी प्रविष्टियाँ हैं और (उन प्रविष्टियों के लिए जो निर्देशिकाएँ हैं) उनके अपने वंशज हैं:

    यह मानते हुए कि $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"

  2. यदि किसी निर्देशिका के वंशजों $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
एड्रियन पनासीक

@ एड्रियन: मैं आपके प्रश्न को समझने की आवश्यकता करूँगा कि इस मामले में कम /x/fनहीं समझा जाए /y। आप यहां जो पूछ रहे हैं वह बहुत अलग संपत्ति है; मैंने इसे अपने उत्तर में जांचने का एक तरीका जोड़ा है।
गिल्स

1

मेरे 'ls' कमांड में फ्लैग है - "निर्देश-कमांड-लाइन-सिमलिंक-टू-डिर" जो फ़ाइल का पूरा रास्ता दिखाता है। यह 'ls' GNU कोरुटिल्स 6.9 से है।


2
यदि आपके पास ऐसा है, तो आपके पास readlinkकोर्यूटिल्स भी हैं , जो मशीन-पार्सबल तरीके से समान जानकारी दिखा सकते हैं। ( Ls के आउटपुट को पार्स न करें। )
गिल्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.