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

Chr*_*s R 19 linux osx filesystems mount

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

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

有可能使用 df,但 df 在这两个平台上的表现截然不同。另外,我必须使用 awk 使用 CLI 刮取它的输出,虽然可行,但它……很脆弱。

此信息必须在某个级别上可用。是否有我不知道的工具可以向我提供这些信息?

Gil*_*il' 17

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

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

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

if df -t sshfs -t nfs -t cifs . >/dev/null 2>/dev/null; then …
Run Code Online (Sandbox Code Playgroud)

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


Elo*_*off 9

您可以在 Linux 上使用 GNU stat:

stat --file-system --format=%T /tmp/subdir/whatever
tmpfs
Run Code Online (Sandbox Code Playgroud)


rud*_*ier 6

在 Linux 上,从 util-linux 2.18 开始就可以使用 findmnt。

findmnt -n -o FSTYPE -T /home
nfs4
Run Code Online (Sandbox Code Playgroud)


Mik*_*kel 3

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

这适用于 Linux。

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

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

# 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 ' '
}
Run Code Online (Sandbox Code Playgroud)

并调用该函数:

get_fs $(get_mount .)
Run Code Online (Sandbox Code Playgroud)

可以使用重写来稍微快一些sed可以使用orawk,但这种方式可能更容易阅读。

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