如何从脚本中检测 NTFS/exFAT 文件系统类型

Jon*_*ave 5 filesystems shell-script ntfs exfat

用户有一个(增量)备份脚本,使用rsync, 到外部设备。这在他拥有的 SSD 上出错了。原来他的设备被格式化了exFAT。这意味着我需要在脚本中检测到这一点,因为我需要将选项更改为rsync(例如,exFAT 无法处理符号链接、没有所有者/组权限等)。

用户正在运行 Linux Mint。我运行 Ubuntu。我只能假设/希望我的 Ubuntu 的解决方案适用于他的 Mint。

我看过:

那里有各种各样的好建议,但我没有看到符合我要求的建议,它们是:

  • 必须报告(可解析)ntfs/exfat显式,而不仅仅是说fuseblk(它会同时用于exfat& ntfs,我需要区分)。
  • 必须要求须藤
  • 必须是从文件系统上的目录路径开始的可执行文件(可以假设它将被挂载),而不仅仅是从/dev/....

从我尝试过的建议来看:

  • fdisk -l, parted -l, file -sL: 需要sudo和/或/dev/...块设备
  • mount: 需要/dev/...,只有报告fuseblk
  • df -T, stat -f -c %T: 接受目录,但只报告fuseblk
  • lsblk -f, blkid: 需要/dev/...块设备

是否有一个简单的命令可以满足所有这些条件?或者,lsblk/blkid似乎正确地报告exfat/ ntfs,如果我需要传递它们,/dev我该如何从脚本中的目录路径中适当地获取它?

Jon*_*ave 7

感谢其他海报回复/建议。这是我的完整解决方案。

df -P可用于从路径获取设备,并且可以提供给以lsblk --fs获取确切的文件系统。所以单行是:

fs=$( lsblk --fs --noheadings $( df -P $path | awk 'END{print $1}' ) | awk 'END{print $2}' )
Run Code Online (Sandbox Code Playgroud)

如果您只需要知道文件系统是fuseblk--- 它涵盖了ntfs&exfat并且最终证明足以满足我的目的--- 这可以用更简单的方法确定:

fs=$( stat -f -c '%T' $path )
Run Code Online (Sandbox Code Playgroud)