シェルスクリプト内のマウントされたリモート(nfs)ファイルシステムに特定のフォルダーが存在するかどうかを確認するための最良の方法(信頼性、移植性など)は何ですか?
次のようなコマンドを探しています。
chk-remote-mountpoint /my/path/to/folder
Stephaneが言うように、「それに対する普遍的なUnixの答えはありません」。
私の質問に対して見つけた最良の解決策:
df -P -T /my/path/to/folder | tail -n +2 | awk '{print $2}'
ファイルシステムのタイプを返します。例:nfs
またはext3
。
-T
オプションではない 標準なので、他のUnix/Linuxシステムでは機能しない可能性があります...
以下のGillesのコメントによれば、「これは組み込みでないLinuxでは機能しますが、BusyBox、* BSDなどでは機能しません。」
GNU stat
を使用できます。
%m
でマウントポイントを見つけます。
$ stat --format=%m /usr/src/linux
/usr/src
%T
(ファイルシステムモードの場合)。ファイルシステムの名前を確認します。
$ stat --file-system --format=%T /usr/src/linux
reiserfs
したがって、私のシステムの/usr/src/linux
は、/usr/src
にマウントされ、ファイルシステムタイプがreiserfs
のファイルシステムに格納されていることがわかります。
詳細については、man stat
も参照してください。これは非常に用途の広いコマンドであり、ファイルに関する情報が必要で、grep | awk
wardnessにフォールバックしたくない場合に、ほとんど常に役立ちます。
mount -l
およびgrep
、sed
、またはawk
を使用して、問題のディレクトリを参照する行を見つけます。
Df(1)の "-l"は、ローカル以外のファイルシステムではエラーで失敗するため、この動作を使用して、ファイルシステムがリモートかどうかを確認できます。
df -l /path 2> /dev/null | grep -q "File"
rc=$?
if [ "$rc" = "0" ]
then
echo "local mount, do stuff"
fi
しかし -l
オプションは 標準ではない です。
残念ながら、それに対する普遍的なUnixの答えはありません。
あなたができることの一つは、与えられたファイルに対して_/a/b/c/d
_がパスをたどることです:
..._st_dev
_が変更されるまで、各レベルでstat(2)
を実行します。次に、マウントポイントの場所がわかります。次に、_/etc/mtab
_またはmount
の出力でそのマウントポイントの正規パスを検索して、ファイルシステムタイプを確認できます。次に、特にFuseタイプのリモートでは、リモートと非リモートを見つけるのが難しくなります。たとえば、nfs
、cifs
、_Fuse.sshfs
_、_Fuse.davfs
_は明白ですが、たとえば、_Fuse.gvfs-Fuse-daemon
_または_Fuse.avfsd
_ネットワークと非ネットワークの両方のファイル?
df /path
は、マウントポイントが/path
ではないと言う場合、/
がマウントポイントであることを通知します。
行う:
df /me/path/to/folder
最初のフィールド(ファイルシステム)の形式がHost:/ pathの場合、NFSであることがわかります。
そう:
df /my/path/to/folder | awk 'NR==1{next};$1~/:[/]/{print "yes";exit(0)};{print "No";exit(1)}'
次に、「ifchk-remote-mountpoint」という名前のbashファイルに入れます。
使用法:
if ifchk-remote-mountpoint /my/path/to/folder >/dev/null; then
...do something...
fi
または:
ISNFS=$(ifchk-remote-mountpoint /my/path/to/folder)
df -t
Linuxおよびdf -T
BSDシステムの場合。
から man df :
-t、-type = TYPE
リストをタイプTYPEのファイルシステムに制限する
if df -t nfs | grep -q /path/to/folder$; then
# it is an NFS
fi