web-dev-qa-db-ja.com

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

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

私はcouldmountコマンドを実行し、その出力を手動で解析し、それをファイルパスと文字列比較するとしますが、それを行う前に、もっとあるかどうか疑問に思っていますエレガントな方法。

私は拡張属性を利用するBASHスクリプトを開発しており、さまざまなファイルシステムとホスト環境で(可能な範囲で)正しいことを実行したいと考えています。

12
smokris

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

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

19
Morven

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

7
Zoredache

特定のファイルだけの場合、それは簡単です

df -T "${FILE}" | awk '{print $2}' | tail -n1
3

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

#!/usr/bin/env bash

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

Linuxのdfとbtrfsには問題があるようです。マウントされたbtrfsボリュームのマウントポイントを見つけるようにdfに要求すると、それは正しいことを行います。この場合、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
2
Marc Singer

うーん。マウントポイントについては、st_devが変更されるまで階層を上に移動できます(その後、マウント境界を越えたところです)。 GNU stat for bashスクリプトがありますが、解析せずにファイルシステムのタイプを推測する方法がわかりません/proc/mountsまたは試行錯誤によって(つまり、拡張属性を設定した後に失敗を処理する)

2

https://stackoverflow.com/questions/2167558/give-the-mount-point-of-a-path から:

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

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

1
Charles Stewart