ファイル名に基づいてファイル権限を変更する

ファイル名に基づいてファイル権限を変更する

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 コマンドの -- は、ダッシュが複数あるファイル名がコマンドを-混同し、ファイル名がオプションであると考えるためです。

関連情報