문자열로 권한 번호를 얻는 방법 : -rw-r--r--


53

동일한 chmod를 설정해야합니다 . -rw-r--r--의 숫자를 얻는 방법은 무엇입니까?


2
프로그래밍 방식으로 또는 번역 방법을 알아야합니까?
mattdm

나는 번역하기가 게으르다 :) 통계는 잠시 동안 괜찮습니다.
cnd

9
“동일하게 설정하다”는 것은 무엇을 의미합니까? -rw-r--r-- 권한이있는 파일이 이미 있고 동일한 권한으로 다른 파일을 설정 하시겠습니까? 그런 다음 chmod지원 여부를 확인하십시오 --reference.“--reference = RFILE은 MODE 값 대신 RFILE 모드를 사용합니다”– man chmod.
manatwork


어떤 유닉스를 사용하고 있습니까?
Kusalananda

답변:


53

stat출력을 확인하십시오 :

# stat .xsession-errors 
  File: ‘.xsession-errors’
  Size: 839123          Blocks: 1648       IO Block: 4096   regular file
Device: 816h/2070d      Inode: 3539028     Links: 1
Access: (0600/-rw-------)  Uid: ( 1000/     lik)   Gid: ( 1000/     lik)
Access: 2012-05-30 23:11:48.053999289 +0300
Modify: 2012-05-31 07:53:26.912690288 +0300
Change: 2012-05-31 07:53:26.912690288 +0300
 Birth: -

11
stat -c %a /path/to/file필요한 마술입니다.
fromnaboo

대답은 위의 액세스 블록에 있습니다. 이 예에서 사용한 파일은 질문의 파일과 다른 액세스 권한을 갖습니다. 질문에있는 사람은 액세스 : (0644 / -rw-r--r--)
nycynik

65
r=4
w=2
x=1

모든 그룹에서. 예는 6 (r + w = ​​4 + 2) 4 (r = 4) 4 (r = 4)입니다.


26

전체 권한 모드 번호는 4 자리 8 진수입니다. 대부분의 경우 가장 작은 3 자리 만 사용합니다. r = 4, w = 2, x = 1을 사용하여 권한 문자열에 각 그룹을 추가하십시오. 예를 들면 다음과 같습니다.

 421421421
-rwxr-xr--
 \_/        -- r+w+x = 4+2+1 = 7
    \_/     -- r+_+x = 4+0+1 = 5
       \_/  -- r+_+_ = 4+0+0 = 4     => 0754

이제 때때로 다음과 같은 이상한 모드 문자열이 나타납니다.

-rwsr-xr-T

네 번째 숫자는 x모드 스트링 의 비트에 오버로드 됩니다. x거기에 다른 문자가 표시되면 이 "특수"네 번째 숫자 비트 중 하나가 설정되어 있고 문자가 소문자 인 경우 x해당 위치에 대해서도 설정됨을 의미합니다. 따라서이 번역은 다음과 같습니다.

   4  2  1
 421421421
-rwsr-xr-T
   +  +  +  -- s+_+T = 4+0+1 = 5  
 \_/        -- r+w+s = 4+2+1 = 7  (s is lowercase, so 1)
    \_/     -- r+_+x = 4+0+1 = 5
       \_/  -- r+_+T = 4+0+0 = 4  (T is uppercase, so 0)   => 05754

숫자가 8 진수임을 표시하는 표준 UNIX 방법은 0으로 시작하는 것입니다. GNU chmod는 사용자가 제공하는 모드가 8 진이라고 가정하지만 0을 추가하는 것이 가장 안전합니다.

마지막으로 +modestring의 끝에 a 가 표시되면

-rwxr-xr-x+

그러면 파일에 확장 권한이 있으며 그 이상이 필요하다는 의미 chmod입니다. 초보자 를 위해 setfaclgetfacl명령을 살펴보십시오 .


10

이것은 간단 할 수 있습니다

-bash-3.2$ stat --format=%a sample_file
755

3

권한은 이진 숫자의 문자열 표현입니다.
0대부분으로 표현되는 -, 나머지는 문자입니다.

기본

기본 권한의 경우 :

모든 변환 -과 모자 ST에를 0, 나머지는 표현한다 1.
이렇게 구성된 이진 숫자는 8 진수로 인쇄해야합니다.

$ a=-rw-r--r--
$ b=${a//[ST-]/0}
$ b=${b//[!0]/1}
$ printf '%04o\n' $((2#$b))
0644

한 줄로 :

$ b=${a//[ST-]/0}; b=${b//[!0]/1}; printf '%04o\n' $((2#$b))
0644

오류 수정 및 다른 3 개 비트를 검출 1000, 2000또는 4000좀 더 많은 코드를 필요 :

#!/bin/bash

Say     (){ printf '%s\n' "$@"; }
SayError(){ a=$1; shift; printf '%s\n' "$@" >&2; exit "$a"; }

e1="Permission strings should have 10 characters or less"
e2="Assuming first character is the file type"
e3="Permission strings must have at least 9 characters"
e4="Permission strings could only contain 'rwxsStT-'"

a=$1

((${#a}>10))  &&   SayError 1 "$e1"
((${#a}==10)) && { Say        "$e2"; a=${a#?}; }
((${#a}<9))   &&   SayError 2 "$e3"
a=${a//[^rwxsStT-]}
((${#a}<9))   &&   SayError 3 "e4"
b=${a//[ST-]/0}; b=${b//[!0]/1}; c=0
[[ $a =~ [sS]......$ ]] && c=$((c|4)) 
[[ $a =~    [sS]...$ ]] && c=$((c|2)) 
[[ $a =~       [tT]$ ]] && c=$((c|1))

printf '%04o\n' "$((2#$b|c<<9))"

0

문자열 및 16 진 권한 값이있는 파일 목록을 가져 오십시오. 출력을 Excel에 더 쉽게 넣을 수 있도록 끝에 % N을 넣으십시오.

stat -c "%A %a %N" *

-rw-r--r-- 644 `file2.txt'
-rw-r--r-- 644 `file3.txt'
-rw-r--r-- 644 `file4.txt'
-rw-r--r-- 644 `file.txt'
drwxr-xr-x 755 `hsperfdata_root'
-rw-r--r-- 644 `junk.txt'
drwx------ 700 `vmware-root'

특정 16 진 권한이있는 모든 파일을 찾습니다.

find /tmp1 -user root -perm 644

-2

Dir의 모든 동시 파일

-bash-4.1$ chmod -R 640 *

모든 파일

-bash-4.1$ chmod 640 *
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.