linux 如何检测文件系统是否支持权限?

cwxwcias  于 2023-11-17  发布在  Linux
关注(0)|答案(1)|浏览(106)

最近我遇到了一个问题,当我的脚本通过tar将临时文件提取到用户选择的文件夹中时。
问题是,如果该文件夹位于带有exfat文件系统的U盘上,则提取的文件会丢失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权限不兼容的文件系统的列表,我确信我的列表远远不够完整,因为存在几十个可能有相同问题的外来文件系统。
那么,有没有更好的方法来测试一个文件夹是否支持权限,而不需要先写一个文件呢?如果没有,我应该在这个列表中添加什么文件系统来使它更完整呢?

2vuwiymt

2vuwiymt1#

可以检查是否可以更改写权限并使其成为一个函数:

#!/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

字符串

相关问题