r
名前が権限の組み合わせ(、、、w
)で構成される512ファイルを作成しました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
名前を8進数(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
8進数は次のように求められます。
- 各文字を
-
0に変更し0
、他の文字を1に変更します1
。 - 2進数を10進数に変換します(シェルは10進数のみを理解するため)。
- 10進数を8進数に変換します。
- 8進数を使用して権限を変更します。
chmod コマンドの -- は、ダッシュが複数あるファイル名がコマンドを-
混同し、ファイル名がオプションであると考えるためです。