最近,当我的脚本通过 tar 将临时文件提取到用户选择的文件夹时,我遇到了一个问题。
问题是,如果该文件夹位于具有
exfat
文件系统的 USB 记忆棒上,则提取的文件会丢失 ext4
和 btrfs
文件系统随每个文件存储的权限信息。
为了解决这个问题,我创建了以下修复程序:
#!/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
权限不兼容的列表,而且我确信我的列表还远未完成。因为存在数十种外来文件系统可能存在相同的问题。
那么有没有更好的方法来测试文件夹是否支持权限呢?如果没有,我应该添加哪些文件系统到这个列表中以使其更完整?
要检测文件系统是否支持权限,您可以创建一个临时文件,然后尝试更改其权限。如果文件系统支持权限,则 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"
此脚本创建一个临时文件,尝试将其权限更改为 600(所有者有读写权限,其他任何人都没有权限),并检查 chmod 命令的退出状态。如果退出状态为0,则命令成功,这意味着文件系统支持权限。如果退出状态不为0,则命令失败,这意味着文件系统不支持权限。然后该脚本会删除临时文件。
我希望我已经帮助澄清了几点。