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

标签 linux bash filesystems file-permissions ext4

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

问题是,如果该文件夹位于具有 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 权限不兼容的列表,而且我确信我的列表还远未完成。因为存在数十种外来文件系统可能存在相同的问题。

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

最佳答案

也许可以检查是否可以更改写入权限并将其设为函数:

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

相关文章:

linux - openstack Quantum VM 能够 ping 通 br-ex,但无法 ping 通外部网络

c - 在 Linux 上从 C 程序直接访问没有 FS 的硬盘

windows - 在Windows的Bash上运行Elasticsearch 1.7.1的问题

ruby - 是否有一个位置可以存储自定义 Ruby 库,以便 Ruby 可以找到它们?

regex - 如何检查 curl 的 http_code 是否在 200 和 299 之间

c - Linux 如何知道要调用哪个 ioctl 函数?

python - 找出每个 clientId 的新旧映射之间的差异

linux - 脚本中 ps aux 和 `ps aux` 之间的不同结果

database - 存储图像 : DB or File System -

windows - Windows 中的新文件创建事件