特定のファイルを含むファイルシステムのマウントポイントを取得する方法


13

特定のFILEを含むファイルシステムのマウントポイントをすばやく見つける方法を探しています。以下の私の解決策よりも簡単または直接的なものはありますか?

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

同様の質問「ディスクがマウントされている場所を確認するコマンドはありますか?」は、現在のディスクのデバイスノードを入力として使用し、ディスクからの任意のファイルではありません...


1
あなたは最終的に離れて行うことができますtr使用して、コールawk -F'% '...
ジョセフ・R.を

回答:


6

あなたは次のようなことができます

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

あるいは

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

awkデフォルトでは空白で分割されるため、を指定する必要-Fはありませんtr。また、で空白をトリミングする必要もありません。最後に、対象の行番号(NR==2)を指定することで、を使用しないこともできますtail


2番目の呪文は最初から2から3に変更する必要がありましたが、そのまま使用できました。きちんとした
Stu

@ギレス、編集ありがとうございます。1つの質問、2つ目は-P権利がなくても機能する必要があり ますか?すべての場合において、によって印刷される最後のフィールドawkはディスクでなければなりません。
terdon

@Stuこれは-P、Gillesが追加したオプションを使用しなかったためと考えられます。
terdon

1
@terdonはい、確かに、最後の行の最後のフィールドはなしで同じ-Pです。それでも-P、の出力を解析するときは常に使用することをお勧めします。dfこの特定の使用が安全であることを確認するよりも簡単です。
Gilles「SO-邪悪になるのをやめる」

いいね $ {FILE}の/ devエントリが必要な場合(何らかの理由で)mount | grep " on $(df -P ${FILE} | awk 'END{print $NF}') type" | awk '{print $1}'
同期されていない

16

GNU / Linuxでは、statcoreutils 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"
}

あなたのアプローチは有効ですが、マウントポイントにスペース、%、改行、またはその他の印刷できない文字が含まれていないことを前提としていますdf。GNUの新しいバージョン(8.21 以降)で少し簡単にすることができます。

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

df--outputオプションを認識しません。
ジョセフR.

@JosephR。バージョン8.21以降ですか?
terdon

@terdonいいえ、バージョン8.13です。
ジョセフR.

2
@JosephR。これはGNU df> = 8.21の機能であることをステファンは答えで説明しています。
terdon

@terdonスキミング中に見逃してしまったに違いありません。
ジョセフR.

8

Linuxの場合、util-linuxから正確に作成されています。

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

バインドマウントが複数ある場合、ランダムなマウントポイントの種類が返されることがあります。使用dfにも同じ問題があります。


2
サブボリュームにあるファイルでも正しく動作します。
ceremcem 2017年

3

statは「デバイス」フィールドを返すので、基になるstat()ライブラリー呼び出しを使用して、POSIX準拠の方法でこの情報をプログラムで取得する方法を知りたいと思っていました。

このCコードのスニペット:

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

コマンドラインにリストされたファイルを含むデバイスのメジャーおよびマイナーデバイスIDを提供します(argv[1])。残念ながら、major()そしてminor()manページの主張は、彼らがGNU / Linuxのほかに、「他の多くのシステム上に存在」しているが、POSIXではありません。

次に、デバイスのメジャー/マイナー番号とデバイスノードの間の対応を、たとえばから取得し、それ/proc/diskstatsをからマウントポイントにマッピングでき/proc/mountsます。/etc/mtab

そのため、これを行うコマンドラインユーティリティは非常に簡単です。


/proc/diskstats唯一のブロックデバイスのために、あなたはNFS、PROC、ヒューズ...少なくともでLinuxを逃してしまう、異なるマウントポイントは同じMAJ +分を持つことができている
ステファンChazelas

それを知りませんでした。またst_dev、あるNFSパーティションを別のNFSパーティションと区別する方法が提供されていないようです。実際にこれを書きたい人は、それを考慮に入れる必要があります;)
goldilocks

+1は、OPがやっていたことよりも「より単純またはより直接的」にCコードを書くことを検討するのに十分なオタクである:)
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();
  }

プログラムによる方法のその他のリンク

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.