我创建了 512 个文件,其名称由权限组合 ( r
、w
、x
) 组成。
我这样创建它们:
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
八进制数通过以下方式获得:
- 将每个字母更改
-
为 00
,将其他任何字母更改为 11
。 - 将二进制数转换为十进制数(因为 shell 只理解十进制数)。
- 将十进制数转换为八进制数。
- 使用八进制数更改权限。
chmod 命令中的 -- 是因为带有几个破折号的文件名-
会让命令感到困惑,它认为文件名是一个选项。