最近,当我的脚本通过 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
权限不兼容的列表,而且我确信我的列表还远未完成。因为存在数十种外来文件系统可能存在相同的问题。
那么有没有更好的方法来测试文件夹是否支持权限,而无需先实际写入文件?如果没有,我应该将哪些文件系统添加到此列表中以使其更加完整?
最佳答案
也许可以检查是否可以更改写入权限并将其设为函数:
#!/usr/bin/env sh
# Checks path support changing write permissions
# @args
# $1: The path to check (mandatory)
# @return
# 0: Allow changing write permission
# 1: Does not allow changing write permission
# 2: Cannot perform the check
canChangeWritePermission() {
[ -d "${1:?}" ] || return 2
__cCWP_tmpFile=$(TMPDIR=$1 mktemp) || return 2
if
chmod -w "$__cCWP_tmpFile" && ! [ -w "$__cCWP_tmpFile" ] &&
chmod +w "$__cCWP_tmpFile" && [ -w "$__cCWP_tmpFile" ]
then rc=0
else rc=1
fi
rm -f -- "$__cCWP_tmpFile"
return $rc
}
if canChangeWritePermission "${1:?}" 2>/dev/null
then printf '%s has support for changing write permission.\n' "$1"
elif [ $? -eq 1 ]
then printf '%s does not allow changing write permission.\n' "$1"
else printf 'Cannot check %s\n' "$1" >&2
fi
关于linux - 如何检测文件系统是否支持权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77468962/