Answers:
正如斯蒂芬(Stephane)所说:“没有通用的Unix答案”。
我发现我的问题的最佳解决方案:
df -P -T /my/path/to/folder | tail -n +2 | awk '{print $2}'
将返回文件系统类型,例如:nfs
或ext3
。
该-T
选项不是标准选项,因此它可能无法在其他Unix / Linux系统上运行。
根据Gilles在下面的评论:“这适用于任何非嵌入式Linux,但不适用于BusyBox,* BSD等。”
/etc/mtab
或mount
代替使用结果df
。
/proc/mounts
mount
,也没有/etc/mtab
,甚至没有/proc/mounts
是标准所以有什么可以被发现那里没有保证...
-T
在这里有不同的含义
您可以使用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
并具有filesystem type的文件系统中reiserfs
。
还请参阅man stat
用于进一步参考。这是一个非常通用的命令,几乎在您需要有关文件的信息而又不想grep | awk
退守时常有用。
stat
不具备%m
的选项--format
(使用Debian挤压,Coreutils的8.5)。因此,我猜这种解决方案不是很可靠。
2010-08-27 <Aaron Burgemeister> stat: add %m to output the mount point for a file
。差不多3年前了。令人惊讶的是Debian仍然没有这个。
mount -l
并使用grep
,sed
或awk
查找引用该目录的行。
/my/path/to/the/directory
实际上是从安装点/my/path
获得答案的结果,这似乎很复杂。也许你可以提供有关一些更多的细节grep
,sed
,awk
命令你的建议(一个完整的答案)?
mount -l | grep 'type nfs' | sed 's/.* on \([^ ]*\) .*/\1/'
应该为您提供系统上所有nfs安装点的列表。
mount | fgrep "`stat --printf=" on %m type" /var/log/`". The
mount`命令将以<device> on <mountpoint> type <type>
格式打印所有安装点。为此,我已经stat --printf
生成了on <mountpoint> type
零件。
不幸的是,没有统一的Unix答案。
您可以针对给定的文件执行以下操作/a/b/c/d
:
...并stat(2)
在每个级别执行一次,直到st_dev
更改。然后,您将知道安装点在哪里。然后,您可以在/etc/mtab
或输出中mount
查找该安装点的规范路径,以查找文件系统类型。然后找出什么是远程的,哪些不是远程的,尤其对于保险丝类型的,将是棘手的。例如,nfs
,cifs
,fuse.sshfs
,fuse.davfs
是显而易见的,但对于例如fuse.gvfs-fuse-daemon
或者fuse.avfsd
可以有网络和非网络的文件?
stat(2)
,我认为您正在引用C函数,但我正在使用shell。然而,st_dev
指的主要和次要设备ID(是Linux特有的?),和shell命令stat(1)
有(非标)%t
,并%T
与--format
分别主次编号的选择,但它始终返回“0”(本地和NFS )。我尝试了Debian Squeeze和Lenny。
--file-system
选项?
--file-system
。
df(1)的“ -l”将在非本地文件系统上失败并显示错误,因此您可以使用此行为来了解文件系统是否为远程:
df -l /path 2> /dev/null | grep -q "File"
rc=$?
if [ "$rc" = "0" ]
then
echo "local mount, do stuff"
fi
但是,该-l
选项不是standard。
df
失败的原因,仅此一项就不是一个很好的答案,但是它正在尝试回答这个问题,所以我不明白为什么您会称其为“不是答案”。
您可以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
我会亲自使用mountpoint
(在Linux上非常可移植!):
NAME
mountpoint - see if a directory is a mountpoint
SYNOPSIS
mountpoint [-d|-q] directory
或showmount
几乎需要在任何实际安装NFS
共享(nfs-common
软件包的一部分)的系统上安装:
NAME
showmount - show mount information for an NFS server
SYNOPSIS
showmount [ -adehv ] [ --all ] [ --directories ] [ --exports ] [ --help ] [ --version ] [ host ]
另一种选择是:
$ mount -l -t nfs | grep 'my mount point'
mountpoint
在这种情况下是标准的。
find . -type d -name nfs -exec mountpoint {} \; | grep not
将检查所有名为“ nfs”的文件夹是否已安装
nfs
。