我想在 bash 脚本中检查目录的文件系统类型。
这个想法是这样的
if [path] is on a [filesystem] filesystem then
filesystem specific command
end if
答案1
在安装了 GNU stat 命令的系统上(与任何标准 Linux 发行版一样),您可以获取给定文件的 fs 类型,而无需使用以下命令进行任何解析stat
:
stat -f -c %T filename
-f
指示stat
提供有关文件系统而不是文件的信息,并将-c %T
输出格式设置为仅包含人类可读的文件系统类型 ( %T
)。
所以你可以使用它(在 bash 中):
if [[ $(stat -f -c %T filename) == ext4 ]]; then
# ext4 specific command
fi
man stat
将提供更多信息。
答案2
使用df
。您可以向它传递一个路径,它会为您提供该路径的文件系统信息。如果您需要文件系统类型,请使用-T
开关,如下所示:
$ df -T test
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/sda2 ext4 182634676 32337180 141020160 19% /home
要提取文件系统类型,您可以解析它(如果设备部分太长,请使用-P
开关以避免断行):df
$ df -PT test | awk 'NR==2 {print $2}'
ext4
因此,您可以在构造中使用该值,if
如下所示:
if [ "$(df -PT "$path" | awk 'NR==2 {print $2}')" = "ext4" ] ; then
it is an ext4 filesystem
fi
请注意,设备列可以包含空格(但很少见),在这种情况下解析将失败。
答案3
与findmnt
(的一部分util-linux
):
findmnt -no fstype -T /path/to/file
使用该选项时
-T,--目标小路如果路径不是挂载点文件或目录,
findmnt
则按相反顺序检查路径元素以获取挂载点。其他两个选项抑制标题行:-n, --noheading
并选择要列出的列:-o, --output
df
fromcoreutils
有一个类似的选项,--output=
可以仅打印某些字段,例如fstype
:
df --output=fstype /path/to/file
不过,没有选项可以删除标头,因此您必须将输出通过管道传输到例如| sed 1d