OP의 시도에서 영감을 얻은 질문 Y에 대한 답변 ( 질문 X 무시) 은 다음과 같습니다 .
#!/bin/bash
LC_COLLATE=C
while read ls_out
do
extra=0
perms=0
for i in {1..9}
do
# Shift $perms to the left one bit, so we can always just add the LSB.
let $((perms*=2))
this_char=${ls_out:i:1}
# If it's different from its upper case equivalent,
# it's a lower case letter, so the bit is set.
# Unless it's "l" (lower case L), which is special.
if [ "$this_char" != "${this_char^}" ] && [ "$this_char" != "l" ]
then
let $((perms++))
fi
# If it's not "r", "w", "x", or "-", it indicates that
# one of the high-order (S/s=4000, S/s/L/l=2000, or T/t=1000) bits
# is set.
case "$this_char" in
([^rwx-])
let $((extra += 2 ** (3-i/3) ))
esac
done
printf "%o%.3o\n" "$extra" "$perms"
done
위의 내용은 몇 가지 bashism을 포함합니다. 다음 버전은 POSIX 호환 인 것 같습니다.
#!/bin/sh
LC_COLLATE=C
while read ls_out
do
extra=0
perms=0
for i in $(seq 1 9)
do
# Shift $perms to the left one bit, so we can always just add the LSB.
: $((perms*=2))
this_char=$(expr "$ls_out" : ".\{$i\}\(.\)")
# Lower case letters other than "l" indicate that permission bits are set.
# If it's not "r", "w", "x", or "-", it indicates that
case "$this_char" in
(l)
;;
([a-z])
: $((perms+=1))
esac
# If it's not "r", "w", "x", or "-", it indicates that
# one of the high-order (S/s=4000, S/s/L/l=2000, or T/t=1000) bits
# is set.
case "$this_char" in
([!rwx-])
: $((extra += 1 << (3-i/3) ))
esac
done
printf "%o%.3o\n" "$extra" "$perms"
done
노트:
용법:
$ echo drwxr-xr-x | chmod-format
0755
$ echo -rwsr-sr-x | chmod-format
6755
$ echo -rwSr-Sr-- | chmod-format
6644
$ echo -rw-r-lr-- | chmod-format
2644
$ echo ---------- | chmod-format
0000
그리고 네, echo
시작하는 텍스트 에는 사용하지 않는 것이 좋습니다 -
. 방금 질문에서 사용법 예제를 복사하고 싶었습니다. 분명히 이것은 0 번째 문자 (즉, 선행 d
/ b
/ c
/ -
/ l
/ p
/ s
/ D
)와 10 번째 ( +
/ .
/ @
)를 무시한다는 점에 유의하십시오 . 관리자 는 세 번째, 여섯 번째 또는 아홉 번째 위치에서 유효한 문자로 / 또는 / 을 ls
정의하지 않을 것이라고
가정합니다 (그렇다면 스틱 으로 구타 해야합니다 ).r
R
w
W
또한, 나는 단지로, 다음 코드를 발견 CAS 에서,
기본 그룹 / / var에 아래의 모든 파일의 사용자 소유권을 복원하는 방법 :
let perms=0
[[ "${string}" = ?r???????? ]] && perms=$(( perms + 400 ))
[[ "${string}" = ??w??????? ]] && perms=$(( perms + 200 ))
[[ "${string}" = ???x?????? ]] && perms=$(( perms + 100 ))
[[ "${string}" = ???s?????? ]] && perms=$(( perms + 4100 ))
[[ "${string}" = ???S?????? ]] && perms=$(( perms + 4000 ))
[[ "${string}" = ????r????? ]] && perms=$(( perms + 40 ))
[[ "${string}" = ?????w???? ]] && perms=$(( perms + 20 ))
[[ "${string}" = ??????x??? ]] && perms=$(( perms + 10 ))
[[ "${string}" = ??????s??? ]] && perms=$(( perms + 2010 ))
[[ "${string}" = ??????S??? ]] && perms=$(( perms + 2000 ))
[[ "${string}" = ???????r?? ]] && perms=$(( perms + 4 ))
[[ "${string}" = ????????w? ]] && perms=$(( perms + 2 ))
[[ "${string}" = ?????????x ]] && perms=$(( perms + 1 ))
[[ "${string}" = ?????????t ]] && perms=$(( perms + 1001 ))
[[ "${string}" = ?????????T ]] && perms=$(( perms + 1000 ))
나는이 코드를 철저히 테스트하지는 않았지만 인식하지 못 l
하거나 L
여섯 번째 위치에 있다는 사실을 제외하고는 효과가있는 것 같습니다 . 그러나이 답변은 단순성과 명확성 측면에서 우수하지만 실제로는 짧습니다 ( 루프 내부 의 코드 만 -rwxrwxrwx
계산하고 주석을 계산하지 않고 단일 문자열 을 처리하는 코드 ). 더 짧아 질 수 있습니다 대체하여
함께 .if condition; then …
condition && …
물론 의 출력을 구문 분석해서는 안됩니다ls
.
stat
졌습니다. 당신은 그것을 가지고 있습니까? (이것은 GNU 도구이므로 대부분 유닉스가 아닌 리눅스에서 사용 가능합니다.)