特定のFILEを含むファイルシステムのマウントポイントをすばやく見つける方法を探しています。以下の私の解決策よりも簡単または直接的なものはありますか?
df -h FILE |tail -1 | awk -F% '{print $NF}' | tr -d ' '
同様の質問「ディスクがマウントされている場所を確認するコマンドはありますか?」は、現在のディスクのデバイスノードを入力として使用し、ディスクからの任意のファイルではありません...
特定のFILEを含むファイルシステムのマウントポイントをすばやく見つける方法を探しています。以下の私の解決策よりも簡単または直接的なものはありますか?
df -h FILE |tail -1 | awk -F% '{print $NF}' | tr -d ' '
同様の質問「ディスクがマウントされている場所を確認するコマンドはありますか?」は、現在のディスクのデバイスノードを入力として使用し、ディスクからの任意のファイルではありません...
回答:
あなたは次のようなことができます
df -P FILE | awk 'NR==2{print $NF}'
あるいは
df -P FILE | awk 'END{print $NF}'
awk
デフォルトでは空白で分割されるため、を指定する必要-F
はありませんtr
。また、で空白をトリミングする必要もありません。最後に、対象の行番号(NR==2
)を指定することで、を使用しないこともできますtail
。
-P
権利がなくても機能する必要があり ますか?すべての場合において、によって印刷される最後のフィールドawk
はディスクでなければなりません。
-P
、Gillesが追加したオプションを使用しなかったためと考えられます。
-P
です。それでも-P
、の出力を解析するときは常に使用することをお勧めします。df
この特定の使用が安全であることを確認するよりも簡単です。
mount | grep " on $(df -P ${FILE} | awk 'END{print $NF}') type" | awk '{print $1}'
GNU / Linuxでは、stat
coreutils 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
オプションを認識しません。
df
> = 8.21の機能であることをステファンは答えで説明しています。
Linuxの場合、util-linuxから正確に作成されています。
findmnt -n -o TARGET --target /path/to/FILE
バインドマウントが複数ある場合、ランダムなマウントポイントの種類が返されることがあります。使用df
にも同じ問題があります。
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 +分を持つことができている
st_dev
、あるNFSパーティションを別のNFSパーティションと区別する方法が提供されていないようです。実際にこれを書きたい人は、それを考慮に入れる必要があります;)
これを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();
}
プログラムによる方法のその他のリンク
tr
使用して、コールawk -F'% '...