根据文件名更改文件权限

根据文件名更改文件权限

我创建了 512 个文件,其名称由权限组合 ( rwx) 组成。

我这样创建它们:

touch ./{r,-}{w,-}{x,-}{r,-}{w,-}{x,-}{r,-}{w,-}{x,-}

我希望这些文件具有与其名称所示相同的权限,例如,文件r-x--xrwx应该具有权限r-x--xrwx

我尝试这样做:

for i in *
do
    u=${i:0:3};g=${i:3:3};o=${i:6:3}
    chmod u=$u,g=$g,o=$o -- $i
done

某些文件最终具有正确的权限,但对于其他文件,权限与名称不匹配。我怎样才能解决这个问题?

答案1

您传递的参数chmod包含-符号,但不应该包含符号。要解决此问题,请删除-符号:

for i in *
do
  u=${i:0:3};g=${i:3:3};o=${i:6:3};
  u=${u//-/};g=${g//-/};o=${o//-/};
  chmod -- "u=$u,g=$g,o=$o" "$i"
done

答案2

您可以将名称转换为八进制数字(例如 744)并使用它来更改权限:

#!/bin/bash
# touch ./{r,-}{w,-}{x,-}{r,-}{w,-}{x,-}{r,-}{w,-}{x,-}

for filename in *
do
    str="$filename"
    str="${str//-/0}"
    str="${str//[^0]/1}"
    dec="$((2#$str+0))"
    oct="$(printf '%03o' "$dec")"
    #echo "$str $dec $oct : "
    chmod -- "$oct" "$filename"
done

八进制数通过以下方式获得:

  • 将每个字母更改-为 0 0,将其他任何字母更改为 1 1
  • 将二进制数转换为十进制数(因为 shell 只理解十进制数)。
  • 将十进制数转换为八进制数。
  • 使用八进制数更改权限。

chmod 命令中的 -- 是因为带有几个破折号的文件名-会让命令感到困惑,它认为文件名是一个选项。

相关内容