如何确定当前工作目录的 fs 类型?

如何确定当前工作目录的 fs 类型?

我需要一种独立于平台的轻量级方法来检测 CWD 的安装类型。具体来说,我需要确定我的 CWD 是否位于 SSHFS、NFS、CIFS、SMB 或本地块存储挂载中。

我需要在 Mac OSX 10.6、10.7 和 RHEL5(至少)上执行此操作。

可以使用 df,但 df 在这两个平台上的行为完全不同。另外,我必须使用 awk CLI 抓取其输出,虽然可行,但……很脆弱。

此信息必须在某种程度上可用。是否有我不知道的工具可以向我提供此信息?

答案1

您无法以独立于操作系统的方式轻松访问文件系统类型。文件系统类型名称依赖于操作系统,因此没有任何动力去建立标准方法。

在非嵌入式 Linux 系统上,stat -f -c %T .显示当前目录的文件系统类型。 OSX 的stat命令没有这样的东西。

由于您想知道的只是文件系统类型是否在有限列表中,因此在 Linux 下,您可以限制打印信息的路径集和文件系统类型集。如果当前目录的文件系统类型不在列表中,您将收到错误(“df:未处理文件系统”)。

if df -t sshfs -t nfs -t cifs . >/dev/null 2>/dev/null; then …

相同的语法可能在 OSX 上工作,也可能不工作;如果没有,请尝试df -T sshfs,nfs,cifs .

答案2

您可以在 Linux 上使用 GNU stat:

stat --file-system --format=%T /tmp/subdir/whatever
tmpfs

答案3

在 Linux 上,自 util-linux 2.18 起就有 findmnt 可用。

findmnt -n -o FSTYPE -T /home
nfs4

答案4

尚未对其进行测试,但df -P在大多数平台上的行为应该相同。

这适用于 Linux。

$ mount | grep "^$(df -Pk . | head -n 2 | tail -n 1 | cut -f 1 -d ' ') " | cut -f 5 -d ' '

或者将其分解为可重用的函数:

# get_mount <directory>
get_mount() {
    df -Pk "$1" | head -n 2 | tail -n 1 | cut -f 1 -d ' '
}

# get_fs <mountpoint>
get_fs() {
    mount | grep "^$1 " | cut -f 5 -d ' '
}

并调用该函数:

get_fs $(get_mount .)

sed可以使用or重写,使其速度稍快一些awk,但这种方式可能更容易阅读。

如果这不起作用,您可以尝试类似的方法,但使用/etc/mtab而不是 的输出mount

相关内容