最近,当我的脚本通过tar将临时文件提取到用户 Select 的文件夹时,我遇到了一个问题.

问题是,如果该文件夹位于包含exfat个文件系统USB闪存盘上,则提取的文件会丢失ext4btrfs文件系统与每个文件一起存储的权限信息.

为了解决这个问题,我创建了以下修复程序:

#!/usr/bin/env bash

FOLDER="/example"
FS=$(stat -f -c %T "$FOLDER")

if [[ "$FS" == "fat"* || "$FS" == "vfat"* || "$FS" == "exfat"* || "$FS" == "ntfs"* || "$FS" == "fuse"* || "$FS" == "msdos"* ]]; then
  echo "Unsupported filesystem!"
  exit
fi

虽然这是可行的,但它要求我保留一个列表,列出哪些文件系统与ext4个权限不兼容,我敢肯定我的列表还远远不完整.因为存在数十个可能存在相同问题的外来文件系统.

那么,有没有更好的方法来测试文件夹是否支持权限,而不必真正先写入文件?如果没有,我应该将哪些文件系统添加到此列表中以使其更加完整?

推荐答案

要检测文件系统是否支持权限,您可以创建一个临时文件,然后try 更改其权限.如果文件系统支持权限,则chmod命令将成功.如果没有,命令将失败.

下面是如何在shell 脚本中实现这一点:

tempfile=$(mktemp)
chmod 600 "$tempfile" 2>/dev/null
if [ $? -eq 0 ]; then
    echo "Filesystem supports permissions"
else
    echo "Filesystem does not support permissions"
fi
rm "$tempfile"

此脚本创建一个临时文件,try 将其权限更改为600(对所有者具有读写权限,对其他任何人没有权限),并判断chmod命令的退出状态.如果退出状态为0,则命令成功,表示文件系统支持权限.如果退出状态不为0,则命令失败,这意味着文件系统不支持权限.然后,该脚本删除该临时文件.

我希望我已经帮助澄清了几点.

Linux相关问答推荐

Aarch64在Linux上是否有红色区域,如果有,是16个字节还是128个字节?

如何在充满 csv 的目录中获得不同的值计数

ENQCMD 指令的好处和微操作是什么?

我可以阅读 Linux 内核的哪些部分以获得乐趣?

判断指定名称的画面是否存在

如何判断 Linux 机器是否支持 AVX/AVX2 指令?

/usr/local/bin/ 中Collection的权限被拒绝

Linux C程序:如何找到函数所属的库

使用 RPATH 但不使用 RUNPATH?

来自远程主机的 mysqldump

如何在 shell 脚本中动态生成新的变量名?

用于 GCC/G++ 的宏来区分 Linux 和 Mac OSX?

如何告诉 CMake 将构建文件放在哪里?

将 CMake 项目导入 Eclipse CDT

用于数据库备份的 Linux shell 脚本

Docker Volume 没有挂载任何文件

从核心转储中获取堆栈跟踪

to_string不是std的成员?

后缀 - status=bounced(未知用户myuser)

在linux中将制表符分隔的文件转换为csv的最快方法