दिए गए फ़ाइल वाले फाइलसिस्टम का आरोह बिंदु कैसे प्राप्त करें


13

मैं फ़ाइल सिस्टम के माउंट पॉइंट को खोजने के लिए एक त्वरित तरीका ढूंढ रहा हूं जिसमें दिए गए FILE युक्त है। क्या मेरे समाधान से कुछ सरल या अधिक प्रत्यक्ष है?

df -h FILE |tail -1 | awk -F% '{print $NF}' | tr -d ' '

इसी तरह का प्रश्न " क्या एक डिस्क देखने के लिए एक कमांड है जहां एक डिस्क माउंट है? " इनपुट के रूप में वर्तमान डिस्क के डिवाइस नोड का उपयोग करता है, और डिस्क से एक मनमाना फ़ाइल नहीं ...


1
आप अंतिम trकॉल का उपयोग करके दूर कर सकते हैंawk -F'% '...
यूसुफ आर।

जवाबों:


6

आप कुछ ऐसा कर सकते थे

df -P FILE | awk 'NR==2{print $NF}'

या और भी

df -P FILE | awk 'END{print $NF}'

चूंकि awkडिफ़ॉल्ट रूप से व्हाट्सएप पर विभाजन होता है, इसलिए आपको निर्दिष्ट करने की आवश्यकता नहीं है -Fऔर आपको व्हाट्सएप के साथ ट्रिम करने की भी आवश्यकता नहीं है tr। अंत में, ब्याज की लाइन संख्या निर्दिष्ट करके ( NR==2) आप दूर भी कर सकते हैं tail


दूसरे स्थान पर काम करने वाले लोगों ने बॉक्स में काम किया, जबकि मुझे पहले 2 से 3 बदलना था। साफ
स्टू

@ गिल्स, संपादन के लिए धन्यवाद। एक सवाल, दूसरा बिना -Pअधिकार के भी काम करना चाहिए ? सभी मामलों में, awkडिस्क द्वारा मुद्रित बहुत अंतिम क्षेत्र होना चाहिए।
terdon

@Stu यह शायद इसलिए है क्योंकि मैंने उस -Pविकल्प का उपयोग नहीं किया था जो गाइल्स ने अभी जोड़ा है।
terdon

1
@terdon हाँ, वास्तव में, अंतिम पंक्ति का अंतिम क्षेत्र बिना समान है -P। फिर भी, मैं हमेशा सलाह देता हूं कि -Pजब आप आउटपुट का उपयोग कर रहे हों df, तो यह जाँचना आसान है कि यह विशेष उपयोग सुरक्षित है।
गिल्स एसओ- बुराई को रोकना '

अच्छा। यदि आपको $ {FILE} (किसी कारण से) के लिए / dev प्रविष्टि अभी करने की आवश्यकता हैmount | grep " on $(df -P ${FILE} | awk 'END{print $NF}') type" | awk '{print $1}'
unsynchronized

16

GNU / Linux पर, यदि आपके पास statCoreUils 8.6 या उससे ऊपर का GNU है, तो आप ऐसा कर सकते हैं:

stat -c %m -- "$file"

अन्यथा:

mount_point_of() {
  f=$(readlink -e -- "$1") &&
    until mountpoint -q -- "$f"; do
      f=${f%/*}; f=${f:-/}
    done &&
    printf '%s\n' "$f"
}

आपका दृष्टिकोण मान्य है, लेकिन मान लिया गया है कि माउंट पॉइंट में स्थान,%, न्यूलाइन या अन्य गैर-मुद्रण योग्य वर्ण नहीं हैं, आप इसे GNU df(8.21 या इसके बाद के संस्करण) के नए संस्करणों के साथ थोड़ा सरल कर सकते हैं :

df --output=target FILE | tail -n +2

मेरा विकल्प dfनहीं पहचानता --output
जोसेफ आर।

@JosephR। यह संस्करण 8.21 या इसके बाद का संस्करण है?
terdon

@terdon नहीं, यह संस्करण 8.13 है।
जोसेफ आर।

2
@JosephR। स्टीफन अपने जवाब में बताते हैं कि यह GNU df> = 8.21 की एक विशेषता है ।
terdon

@terdon क्षमा करें, इसे स्किमिंग करते समय याद किया जाना चाहिए।
जोसेफ़ आर।

8

लिनक्स के लिए हमने इसके लिए बिल्कुल उपयोग-लिनेक्स से खोज की है

findmnt -n -o TARGET --target /path/to/FILE

ध्यान दें कि किसी तरह के बाँध माउंट होने की स्थिति में कुछ प्रकार के यादृच्छिक माउंटपॉइंट लौटाए जा सकते हैं। इस्तेमाल करने dfमें भी यही समस्या है।


2
सबवॉल्म्स में मौजूद फ़ाइलों के साथ भी सही ढंग से काम करता है।
सेरेमनी

3

चूंकि stat"डिवाइस" फ़ील्ड देता है, इसलिए मैं यह देखने के लिए उत्सुक था कि stat()POSIX अनुपालन तरीके से इस जानकारी को प्रोग्रामेटिक रूप से प्राप्त करने के लिए अंतर्निहित लाइब्रेरी कॉल का उपयोग कैसे किया जा सकता है।

सी कोड का यह स्निपेट:

#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>

int main (int argc, const char *argv[]) {
    struct stat info;
    stat(argv[1], &info);
    printf("min: %d maj: %d\n",
        minor(info.st_dev),
        major(info.st_dev)
    );

    return 0;
}  

कमांड लाइन ( argv[1]) पर सूचीबद्ध फ़ाइल वाले डिवाइस के लिए प्रमुख और मामूली डिवाइस आईडी देगा । दुर्भाग्य से, major()और minor()POSIX नहीं हैं, हालांकि मैन पेज का दावा है कि वे GNU / लिनक्स के अलावा "कई अन्य प्रणालियों पर मौजूद हैं"।

इसके बाद आप डिवाइस मेजर / माइनर नंबर और डिवाइस नोड के बीच से एक पत्राचार प्राप्त कर सकते हैं, उदाहरण के लिए /proc/diskstats, और मैप करें कि /proc/mountsउर्फ से माउंट करें । /etc/mtab

तो यह करने के लिए एक कमांड-लाइन उपयोगिता बहुत सरल होगी।


/proc/diskstatsकेवल ब्लॉक डिवाइसेस के लिए, आपको NFS की याद आएगी, खरीद, फ़्यूज़ ... लिनक्स पर कम से कम, अलग-अलग
माउंटप्वाइंट

नहीं जानता था कि, thx। यह भी लगता है कि st_devएक NFS विभाजन को दूसरे से अलग करने का एक तरीका प्रदान नहीं कर सकता है। जो कोई भी वास्तव में इसे लिखना चाहता है, उसे इस बात को ध्यान में रखना होगा;)
गोल्डीलॉक्स

+1 एक गीक होने के लिए जिसे आप ओपी क्या कर रहे थे की तुलना में सी कोड "सरल या अधिक प्रत्यक्ष" लिखने पर विचार करते हैं।
terdon

0

यदि आप C ++ से ऐसा करना चाहते हैं, तो यहां C ++ कोड अधिक है ...

  #include <boost/filesystem.hpp>
  #include <sys/stat.h>

  /// returns true if the path is a mount point
  bool Stat::IsMount(const std::string& path)
  {

      if (path == "") return false;
      if (path == "/") return true;

      boost::filesystem::path path2(path);
      auto parent = path2.parent_path();

      struct stat sb_path;
      if (lstat(path.c_str(), &sb_path) == -1) return false; // path does not exist
      if (!S_ISDIR(sb_path.st_mode)) return false; // path is not a directory

      struct stat sb_parent;
      if (lstat(parent.string().c_str(), &sb_parent) == -1 ) return false; // parent does not exist

      if (sb_path.st_dev == sb_parent.st_dev) return false; // parent and child have same device id

      return true;

  }

  /// returns the path to the mount point that contains the path
  std::string Stat::MountPoint(const std::string& path0)
  {
      // first find the first "real" part of the path, because this file may not exist yet
      boost::filesystem::path path(path0);
      while(!boost::filesystem::exists(path) )
      {
          path = path.parent_path();
      }

      // then look for the mount point
      path = boost::filesystem::canonical(path);
      while(! IsMount(path.string()) )
      {
          path = path.parent_path();
      }

      return path.string();
  }

प्रोग्रामेटिक तरीकों के लिए अधिक लिंक

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