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