一般的な最新のUNIX環境(たとえば、GNU/Linux、GNU/Solaris、またはMac OS X)で、特定の絶対ファイルパスがどのマウントポイントとファイルシステムタイプであるかを判別する良い方法はありますか?
私はcouldmount
コマンドを実行し、その出力を手動で解析し、それをファイルパスと文字列比較するとしますが、それを行う前に、もっとあるかどうか疑問に思っていますエレガントな方法。
私は拡張属性を利用するBASHスクリプトを開発しており、さまざまなファイルシステムとホスト環境で(可能な範囲で)正しいことを実行したいと考えています。
コマンドdf(1)
は1つ以上の引数を取り、そのファイルまたはディレクトリが存在するマウントポイントとデバイス、および使用法情報を返します。次に、パスまたはデバイスを使用して、mount -v
などの出力でファイルシステムタイプを検索できます。
残念ながら、df
とmount
の両方の出力形式はシステムに依存しています。少なくとも私がSolaris、NetBSD、Mac OS Xの間で見ることができるように、明確な標準はありません。
stat を使用できます。コマンドstat --printf '%d' filename.txtは、デバイス番号を16進数または10進数として返します。
特定のファイルだけの場合、それは簡単です
df -T "${FILE}" | awk '{print $2}' | tail -n1
df
を使用する際の問題の1つは、出力のデバイス名が長い場合、行が折り返されるため、最後の行を取得できないことです。代わりに、最初の行を取り除き、新しい最初の行を取得して、最初のフィールドを出力します。
#!/usr/bin/env bash
path=$1
curdir=$(pwd)
cd $path
df . | tail -n +2 | head -1 | awk '{print $1}'
cd $curdir
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
うーん。マウントポイントについては、st_devが変更されるまで階層を上に移動できます(その後、マウント境界を越えたところです)。 GNU stat
for bashスクリプトがありますが、解析せずにファイルシステムのタイプを推測する方法がわかりません/proc/mounts
または試行錯誤によって(つまり、拡張属性を設定した後に失敗を処理する)
https://stackoverflow.com/questions/2167558/give-the-mount-point-of-a-path から:
df -P $path | tail -1 | awk '{ print $NF}'
* BSDとsysVの両方、および奇妙な自動マウントされたディレクトリで、私がテストしたすべての場所で動作します。それが失敗するケースを聞いて私は嬉しく思います。