প্রদত্ত ফাইলযুক্ত ফাইল সিস্টেমের মাউন্ট পয়েন্ট কীভাবে পাবেন


13

আমি প্রদত্ত একটি ফাইল যুক্ত ফাইল সিস্টেমের মাউন্ট পয়েন্টটি খুঁজে পাওয়ার জন্য একটি দ্রুত উপায় সন্ধান করছি। নীচে আমার সমাধানের চেয়ে সহজ বা আরও প্রত্যক্ষ কিছু আছে কি?

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


২ য় আগমনটি বাক্সের বাইরে কাজ করেছিল, যখন আমাকে প্রথমটিতে ২ থেকে ৩ টি পরিবর্তন করতে হয়েছিল। ঝরঝরে
স্টু

@ গিলস, সম্পাদনার জন্য ধন্যবাদ। একটি প্রশ্ন, দ্বিতীয়টি কি -Pঠিক না করেও কাজ করা উচিত ? সব ক্ষেত্রে, দ্বারা প্রিন্ট করা খুব শেষ ক্ষেত্রটি awkডিস্ক হওয়া উচিত।
টেরডন

@ এসটিউ সম্ভবত এটি কারণ আমি -Pগিলস কেবল যুক্ত করা বিকল্পটি ব্যবহার করিনি not
টেরডন

1
@ ইটারডন হ্যাঁ, সত্যই, শেষ লাইনের শেষ ক্ষেত্রটি ছাড়া একই -P। তবুও আমি -Pআপনাকে সর্বদা ব্যবহারের পরামর্শ দিই যখন আপনি আউটপুটটি বিশ্লেষণ করেন df, এই নির্দিষ্ট ব্যবহারটি নিরাপদ কিনা তা যাচাই করা তার চেয়ে সহজ।
গিলস 'দুষ্ট হওয়া বন্ধ করুন'

সুন্দর। আপনার যদি এখন dev mount | grep " on $(df -P ${FILE} | awk 'END{print $NF}') type" | awk '{print $1}'
ILE

16

জিএনইউ / লিনাক্স-এ, আপনার যদি statকোরিটিলস 8.6 বা তদুর্ধ্বের থেকে জিএনইউ থাকে তবে আপনি এটি করতে পারেন:

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 না এটির সংস্করণ 8.13।
জোসেফ আর।

2
@JosephR। স্টিফেন তার উত্তরে ব্যাখ্যা করেছেন যে এটি জিএনইউ df> = 8.21 এর বৈশিষ্ট্য ।
টেরডন

@ এটারডন সরি, স্কিমিং করার সময় অবশ্যই মিস করেছেন।
জোসেফ আর।

8

লিনাক্সের জন্য আমরা ব্যবহার-লিনাক্স থেকে ঠিক এর জন্য তৈরি থেকে সন্ধান পেয়েছি

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

নোট করুন যে কয়েকটি ধরণের বাঁধাইয়ের মাউন্ট থাকলে একরকম এলোমেলো মাউন্টপয়েন্ট ফিরে আসতে পারে। ব্যবহার dfএকই সমস্যা আছে।


2
সাবভলিউমে থাকা ফাইলগুলির সাথেও সঠিকভাবে কাজ করে।
আনুষ্ঠানিক

3

যেহেতু statএকটি "ডিভাইস" ক্ষেত্রটি ফেরত আসে, তাই আমি জানতে আগ্রহী ছিলাম যে অন্তর্নিহিত stat()লাইব্রেরি কলটি কোনও পসিক্স অনুগতভাবে প্রোগ্রামের মাধ্যমে এই তথ্যটি পেতে পারে।

সি কোডের এই স্নিপেট:

#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()পসিক্স নয়, যদিও ম্যান পেজ দাবি করেছে যে তারা জিএনইউ / লিনাক্স ছাড়াও "অন্যান্য অনেক সিস্টেমে উপস্থিত" রয়েছে।

তারপরে আপনি ডিভাইস প্রধান / গৌণ সংখ্যা এবং ডিভাইস নোডের মধ্য থেকে উদাহরণস্বরূপ /proc/diskstats, এবং মানচিত্রের মধ্যে চিঠি পেতে পারেন, যার থেকে পয়েন্টগুলি মাউন্ট করতে হবে /proc/mounts, ওরফে। /etc/mtab

সুতরাং এটি করার জন্য একটি কমান্ড-লাইন ইউটিলিটি বেশ সহজ হবে।


/proc/diskstatsকেবলমাত্র ব্লক ডিভাইসগুলির জন্য, আপনি এনএফএস, প্র্যাক, ফিউজ মিস করবেন ... লিনাক্সে কমপক্ষে, বিভিন্ন মাউন্টপয়েন্টগুলিতে একই মাজ + মিনিট থাকতে পারে
স্টাফেন চ্যাজেলাস

জানতেন না, থেক্স। এটিও মনে হয় যে st_devএকটি এনএফএস বিভাজনকে অন্যের থেকে আলাদা করার কোনও উপায় সরবরাহ করতে পারে না। যে আসলে এটি লিখতে চায় সে বিষয়টি বিবেচনায় নিতে হবে;)
সোনারলকস

গিপ পর্যাপ্ত হওয়ার জন্য +1 যা আপনি ওপি যা করছেন তার চেয়ে সি কোড "সরল বা আরও সরাসরি" লেখাকে বিবেচনা করে।
টেরডন

0

আপনি যদি সি ++ থেকে এটি করতে চান তবে এখানে আরও সি ​​++ কোড রয়েছে ...

  #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();
  }

প্রোগ্রাম্যাটিক উপায়ে আরও লিঙ্ক

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.