파일 이름을 기준으로 파일 권한 변경

파일 이름을 기준으로 파일 권한 변경

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.
  • 이진수를 십진수로 변환합니다(쉘은 십진수만 이해하므로).
  • 10진수를 8진수로 변환합니다.
  • 8진수를 사용하여 권한을 변경합니다.

chmod 명령의 --는 대시가 여러 개 있는 파일 이름이 -명령을 혼동하고 파일 이름이 옵션이라고 생각하기 때문입니다.

관련 정보