명령 행에서 8 진 파일 권한을 얻으려면 어떻게해야합니까?


373

파일 권한을 설정 하는 chmod 명령이 있지만 명령 행에서 8 진수 모드 (755와 같은)로 파일 권한을 얻을 수 있습니까?


2
이 페이지에 실수로 방문했지만 실제로는 Mac에서이 작업을 수행하는 방법을 찾고 있던 사람들은 다음과 같습니다. stackoverflow.com/a/14855227/470749
Ryan

2
stat --format "%A" $FILE사람이 읽을 수있는 drwxr-x---형식을 제공 합니다. 유용하거나 유용하지 않을 수 있습니다.
Trevor Boyd Smith

답변:


535

당신은 시도 할 수 있습니다

stat -c "%a %n" *

교체 *관련 디렉토리 또는 검사 할 정확한 파일 이름으로.

statman 페이지 에서

-c  --format=FORMAT
          use  the  specified  FORMAT instead of the default; output a newline after
          each use of FORMAT
%a     Access rights in octal
%n     File name

용법:

  • 파일로 :

    $ stat -c "%a %n" ./Documents/Udev.html 
    664 ./Documents/Udev.html
    
  • 폴더 포함 :

    $ stat -c "%a %n" ./Documents/
    755 ./Documents/
    

(참고)


57
맥 OS에서, 사용 stat -f '%A %a %N' *(신용 : geeklog.adamwilson.info/article/58/… )
s2t2

1
당신이 더 편안하다면 ls:for f in $(ls -a); do stat -c "%a %n" $f; done;
usandfriends

2
@usandfriends의 출력을 반복 ls하는 것은 나쁜 생각입니다. 만약 당신이 정말로 루프를 사용하고자한다면for f in *; do stat "%a %n" "$f"; done
Tom Fenech

1
왜 Mac OS에서 모든 것이 약간 변경되었습니다 (유닉스 iso utils에서도)? 이것의 실제 이유가 있습니까?
Vassilis

2
@hackel하시기 바랍니다, 당신이 어떻게 느끼는지 알려주십시오. 롤!
MikeSchinkel

44

Linux의 파일 권한은 Linux stat 명령을 사용하여 8 진 형식으로 표시 할 수 있습니다.

키보드에서 Ctrl+ Alt+ T를 누르면 터미널이 열립니다. 파일이 열리면 8 진 모드로 파일 권한을 찾으려는 디렉토리로 이동하십시오.

stat -c '%A %a %n' *

인간이 읽을 수있는 형태의 액세스 권한

8 진의 액세스 권한

% n 파일 이름

8 진수 및 권한

8 진수를 사용하여 모드 / 권한을 나타낼 수 있습니다.

r: 4
w: 2
x: 1

예를 들어 파일 소유자의 경우 다음과 같이 8 진 모드를 사용할 수 있습니다. 8 진수로 된 파일에 대한 읽기, 쓰기 및 실행 (전체) 권한은 0 + r + w + x = 0 + 4 + 2 + 1 = 7입니다.

8 진 파일에 대한 읽기 및 쓰기 권한 만 0 + r + w + x = 0 + 4 + 2 + 0 = 6입니다.

8 진 파일에 대한 읽기 및 실행 권한은 0 + r + w + x = 0 + 4 + 0 + 1 = 5입니다.

그룹 및 다른 사람의 권한을 계산하려면 위의 방법을 사용하십시오. 소유자에게 모든 권한을 부여하고 그룹에 대한 읽기 및 실행 권한을 부여하고 다른 사람에게만 읽기 권한을 부여하려면 다음과 같이 권한을 계산해야합니다. 사용자 = r + w + x = 0 + 4 + 2 + 1 = 7 그룹 = r + w + x = 0 + 4 + 2 + 0 = 6 기타 = r + w + x = 0 + 0 + 0 + 1 = 1

유효 권한은 761입니다.

출처 : http://kmaiti.blogspot.com/2011/09/umask-concept.html


2
초기 0도 특수 비트를 나타냅니다. pastebin.com/6ymkFt71
Braiam

36

에 설명 된대로 '1!'와 '755'스타일의 권한 에 의해 아담 CourtemancheAgileAdam.com , 당신은 만들 수 있습니다 별칭 lso 처럼 행동 ls -l하지만, 약간의 출력 처리 1 도 8 진수로 표시 권한. 그러면 3 자리 2 개의 8 진수 권한을 나타내는 선행 열이 추가 됩니다. 작성된 것처럼, 이것은 대부분의 파일 및 디렉토리에서 작동하지만 고정 또는 setuid / setgid 비트가 설정된 경우 제대로 작동하지 않습니다 .

alias lso="ls -alG | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(\$1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(\" %0o \",k);print}'"

그러나 techtonik이 지적한 것처럼 이것은 심각한 단점이 있습니다 . 당신은 인수를 전달할 수 없습니다 여기에 lso당신이하는 것처럼 별명 명령 그들이에 추가 인수로 촬영하고 있기 때문에, 대신. 따라서 당신은 실행할 수 없습니다 특정 파일이나 디렉토리에 않으며, 당신은 어떤 옵션 (같은 전달할 수 있습니다 , 또는 으로) .lsawklso-F--colorlso


수정 프로그램을 정의하는 것입니다 lso A와 기능 보다는 별명.

lso() { ls -alG "$@" | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }

쉘에서 대화식으로 이것을 시도하고 있다면 unalias lso, 별칭을 제거하기 위해 실행 하십시오. 함수를 정의하기 전이나 후에 할 수 있습니다. 와 같은 소스 파일에 파일을 넣는 경우 줄 ~/.bashrc을 꺼내고 alias함수 정의를 추가하십시오.

왜 이것이 작동합니까? 별명과 달리, bash 쉘 함수는 위치 매개 변수 , 즉 명령 행 인수를 사용할 수 있습니다. "$@"전체 인수 목록으로 확장 하여 lso함수의 인수 가 전달되도록 ls합니다. 별칭 정의와 달리 함수 본문은 인용되지 않으므로 및 \앞에 있는 문자 를 제거해야했습니다 .$"

lso이 방법을 함수로 정의하면 옵션을 전달할 수 있으므로 정의에서 -a-G옵션 을 제거 할 수 있습니다. 원하는 경우 수동으로 전달할 수 있습니다. ( 옵션은 표시 할 파일 권한과 같은 세부에 필요한 모든에서 , 그래서 이점을 제거에 존재하지 않는다.)-l

lso() { ls -l "$@" | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }

별칭 으로 정의 할 때의 한계지적한 techtonik 에게 감사의 말을 전 합니다.lso


1 이것이 에서 출력을 구문 분석하지 않는 것에 대한 일반적인 규칙ls 을 어 기고 있는 것처럼 보일 수 있습니다 . ls매우 사람이 읽을 수있는 출력을 생성합니다. 이것은 특질과 한계를 도입하여 일반적으로 다른 명령에 대한 입력으로 부적합합니다. 이 경우 우리는 구문 분석 ls이후 우리의 정확한 동작을 유지하고자하는ls 우리를 제외하고 하나 명의 추가 변경.

2 이 별칭의 한 가지 제한은 아래에 표시된 기능 버전에도 적용되며 버그로 간주 될 수 있습니다 . 네 번째 8 진수가 0 인 경우에도 3 개의 8 진수 만 표시한다는 것 입니다. 으로 jfmercer가 있다 바르게 지적 , 여기에 표시 8 진수는 스티키 비트 존재하는 경우,도이 setuid 또는 setgid 비트를 반영하지 않습니다.

3 더 심각 단지 네 번째 8 진수를 보여주는하지 않는 것보다이 방법이 있다는 것입니다 가정 들이 설정되지 않으며, 당신이 볼 경우 -가있는 경우 t, s또는 S권한 문자열 - 다음은 8 진수를 무시한다 . 이는 고정 setuid / setgid 비트를 설명하지 않는 방식으로 비트가 권한 문자열에서 유추되기 때문입니다.


디렉토리와 함께 작동하지 않습니다awk: read error (Is a directory)
anatoly techtonik

@techtonik 이것을 지적 해 주셔서 감사합니다! 이 답변을 수정하여 해당 답변을 (최종) 업데이트했습니다.
Eliah Kagan

1
--color쇼 색상에 대한 매개 변수를 추가 할 수 있습니다lso() { ls -alG "$@" --color | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }
tagplus5

1
이 글을 게시 한 후 sticky setuid / setgid 문제에 대한 해결책을 찾으셨습니까?
Silvestris

21

이전 '통계'관련 답변을 확장 / 단순화하면됩니다.

간단하게 실행할 수 있습니다.

stat <path_to_file>

출력에는 다른 정보와 함께 8 진 권한이 포함됩니다.



세부 사항 (상태 버전 및 예) :

# stat --version
stat (GNU coreutils) 8.4


[user@localhost ~]# touch /tmp/TEST_PERMISSONS

[user@localhost ~]# chmod 644 /tmp/TEST_PERMISSONS

[user@localhost ~]# stat /tmp/TEST_PERMISSONS
  File: `/tmp/TEST_PERMISSONS'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d    Inode: 1010058     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-08-26 18:58:59.000000000 +0300
Modify: 2015-08-26 18:58:59.000000000 +0300
Change: 2015-08-26 18:59:16.000000000 +0300

참고 : ( 0644 / -rw-r--r--)


6

이식성을 위해 다음을 사용할 수 있습니다 perl.

$ perl -e 'printf "%04o %s\n", (stat)[2] & 07777, $_ for @ARGV' *.txt
0644 1.txt
0644 2.txt
0644 3.txt
0644 4.txt
0600 PerlOneLiner.txt
0664 perl.txt

언제 오류가 발생했는지 확인하려면 다음을 시도하십시오.

perl -e '
for (@ARGV) {
    print "$!: $_\n" and next unless -e;
    printf "%03o %s\n", (stat)[2] & 07777, $_;
}
' *.txt

2
@cuonglm의 솔루션은 이식성이 뛰어날뿐만 아니라 3 개가 아닌 4 개의 8 진수 문자 를 보여 주므로 종종 잊혀지는 "sticky bit"의 상태를 보여줍니다.
jfmercer

2

동작 find과 함께 사용할 수 있습니다 -printf.

ls8 진 권한을 표시하지 않지만 다음과 같은 find해결 방법을 사용할 수 있습니다 .

find path -printf "%m:%f\n"

예를 들어, 비디오 디렉토리를 확인하려면 :

$ find Videos -printf "%m:%f\n"
755:Videos

%m형식 지정은 말한다 -printf그동안, 진수 권한을 인쇄하기위한 조치를 %f형식 지정 파일 이름을 인쇄 할됩니다.

에 여러 파일 이름을 전달할 수 있습니다 find. 글로브를 사용할 수도 있습니다 (예 :) find * -printf "%m:%f\n".

-name또는 같은 테스트를 사용할 필요는 없습니다 -iname. 시작점으로 관심있는 파일 또는 디렉토리의 이름을 전달하면 충분합니다 find. 즉, find위에 표시된대로 단어 바로 뒤에 인수로 이름을 제공하십시오 .

find출력을 표시하는 방법을 잘 제어 할 수 있습니다. 특히 유용하다고 생각되는 두 가지 수정 사항이 있습니다.

  • 기본적으로 find와 비슷한 하위 디렉토리를 반복합니다 ls -R. find전달하는 시작점의 하위 디렉토리를 방문 하지 않으려는 경우 추가 -maxdepth 0하거나 -maxdepth다른 값과 함께 사용 하여 원하는 깊이를 표시 할 수 있습니다 .

    $ find Documents -maxdepth 0 -printf "%m:%f\n"
    755:Documents
    
  • %f파일 이름 만 표시하므로 파일 find을 찾기 위해 되풀이해야하는 경우 파일 위치를 모를 수 있습니다. 파일을 찾은 시작점부터 시작하여 경로를 표시하려면 %p대신 사용하십시오.

    $ find /boot -printf "%m:%p\n"
    755:/boot
    644:/boot/initrd.img-4.4.0-92-generic
    600:/boot/System.map-4.4.0-93-generic
    600:/boot/vmlinuz-4.4.0-92-generic
    600:/boot/vmlinuz-4.4.0-93-generic
    ....

명령 man find사용에 대한 자세한 정보를 참조하십시오 find.

다른 방법 ( lsawk)

권한이있는 모든 디렉토리 파일을 나열하는 데 사용할 수 있습니다.

ls -l | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/) \
             *2^(8-i));if(k)printf("%0o ",k);print}'

이것은 본질적으로 Adam Courtemanche의 lso별칭 과 동일한 명령 이며, 그 대답 은 단일 명령으로 실행됩니다. 이것을 한 번만 사용하거나 드물게 사용하는 경우 별칭 또는 셸 함수로 작성하는 것을 귀찮게하지 않을 수 있습니다.

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