* nixでは、特定のファイルがどのファイルシステムにあるかをどのように判断するのですか?


12

一般的な最新のUNIX環境(GNU / Linux、GNU / Solaris、Mac OS Xなど)で、特定の絶対ファイルパスがどのマウントポイントとファイルシステムタイプにあるかを判断する良い方法はありますか?

私は、私が思うことができ、実行mountコマンドをし、手動での出力を解析して、私のファイルパスとそれを文字列比較が、私はもっとエレガントな方法があります場合、私は思ったんだけどそれを行う前に。

私は、拡張属性を利用するBASHスクリプトを開発しており、さまざまなファイルシステムおよびホスト環境向けにDo The Right Thing(できる限りではないが)を実行したいと考えています。

回答:


19

このコマンドdf(1)は1つ以上の引数を取り、そのファイルまたはディレクトリが存在するマウントポイントとデバイス、および使用情報を返します。その後、パスまたはデバイスを使用して、出力mount -vまたは同様のファイルシステムタイプを検索できます。

残念ながら、出力の両方の形式dfとは、mountシステムに依存しています。少なくとも、Solaris、NetBSD、Mac OS Xの間に見られるように、明らかな標準はありません。


1
df -PPOSIX準拠のシステムで標準化された出力を生成する必要があります。より複雑なシステムでは、POSIXLY_CORRECTなどの魔法の環境変数も設定する必要がある場合があります。
ダンモールディング14年

例でdf /path-to-the-directoryは、そのディレクトリのパーティションが含まれています
Hasanuzzaman Sattar

7

statを使用できます。コマンドstat --printf '%d' filename.txtは、デバイス番号を16進数/ 10進数で返します


それで、それに基づいてデバイス名を見つける方法は?
デイジー

/ dev /内のすべてのデバイスファイルを調べて、statが報告したものと同じマイナー番号を持つデバイスファイルを検索する必要があります。
ヴィースワフヘール

stat --printf "%d"デバイスのマイナー番号を教えてくれますが、デバイス名とそのマウントされたファイルシステムを取得するために、さらにやるべきことがあります。
クレイグマックイーン

2
おそらく最近追加されたものstat --format '%m' $fileですが、マウントポイントstat --file-system --format '%T' $mountを提供し、ファイルシステムタイプ名を提供します。
ロアイマ

1
@TomHale:覚えていない、正直に言うと。しかし、私はそれがうまくいかなかったことを覚えています。確かに、ディストリビューション、カーネルのバージョンなどを述べるべきでした。しかし、あなたはそれが機能していると述べ、それが修正されることを意味するかもしれません。最終結果が機能する場合、素晴らしい:)
0xC0000022L


2

ふむ マウントポイントの場合、st_devが変更されるまで階層を上ることができます(マウント境界を越えた直後)。statbashスクリプト用のGNUがあります。ただし、解析せずに、/proc/mountsまたは試行錯誤によってファイルシステムのタイプを推測する方法がわかりません(つまり、拡張属性を設定した後に障害を処理します)


2

使い方の1つの落とし穴dfは、出力のデバイス名が長い場合、その行が折り返されるため、最後の行を取得できないことです。代わりに、最初の行を取り除き、新しい最初の行を取得して、最初のフィールドを印刷します。

#!/usr/bin/env bash

path=$1
curdir=$(pwd)
cd $path
df . | tail -n +2 | head -1 | awk '{print $1}'
cd $curdir

3
'df -P'を使用してPOSIX形式で出力を取得し、改行せずにこの問題を回避します。
MikeyB 09

2

Linuxのdfとbtrfsには問題があるようです。dfにマウントされたbtrfsボリュームのマウントポイントを見つけるように要求すると、正しいことを行います。この場合、joeは/ m / whale / backupのサブディレクトリです。

# df /srv/backup/joe
Filesystem      1K-blocks      Used  Available Use% Mounted on
/dev/md126     2930135488 307676684 2619663252  11% /m/whale/backup

ただし、参照されているディレクトリがサブボリュームである場合、マウントポイントは通知されません。

# df /srv/backup/joe/code
Filesystem      1K-blocks      Used  Available Use% Mounted on
-              2930135488 307676684 2619663252  11% /a/whale/backup/joe/code

/ a / whale / backupは、カーネルによる唯一のマウントポイントです。

# mount | grep whale
/dev/md126 on /a/whale/backup type btrfs (rw,relatime,space_cache)

FWIW、statは同じことをします:

# stat --printf '%m\n' /srv/backup/joe/code
/a/whale/backup/joe/code

1

/programming/2167558/give-the-mount-point-of-a-pathから:

 df -P $path  | tail -1 | awk '{ print $NF}'

* BSDとsysVの両方、および奇抜な自動マウントされたディレクトリに対して、私がテストしたすべての場所で動作します。失敗するケースを聞いてうれしいです。


1
推奨コードdf -P $ path | テール-1 | Solarisの「df」は「-P」オプションをサポートしていないため、私が試したすべてのバージョンのSolaris(2.5.1、8、9、および10)でawk '{print $ NF}'が失敗します。
ピータージョンアクラム

@ピーター:私は思っていたよりもあまり喜んでいません。しかし、問題が自明でないことを知ることは興味深いです。正しいことは、ライブラリが問題を適切に解決したスクリプト言語でコマンドを書くことだと思います。たとえば、Pythonには、マウントポイントを与えるos.path.splitunc()関数があり、Solarisで動作すると仮定しています。
チャールズスチュワート

@CharlesStewart:悲しいことに、私の知る限り、Pythonにはそのような関数はありません。os.path.splitunc()以下のために働くだけでUNCパスとあるWindows上でのみ利用可能
アレクシトルハモ14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.