파일이 방금 생성되었을 때 설정된 권한을 갖도록 마스크를 기반으로 권한을 기본값으로 재설정하는 방법
내가 달성하고 싶은 것의 예:
umask
0022로 설정하여
touch file
mkdir directory
이제 파일의 권한이rw-r--r--
이제 디렉토리의 권한은 다음과 같습니다.rwxr-xr-x
chmod 777 file
chmod 777 directory
이제 파일의 권한이rwxrwxrwx
이제 디렉토리의 권한은 다음과 같습니다.rwxrwxrwx
파일 및 rw-r--r--
디렉터리 에 대한 권한을 기본값으로 재설정하는 방법이 있습니까 ?rwxr-xr-x
chmod
답변1
빼기 사용은 특정 umask 값에 대해서만 정확합니다. 예를 들어 다음과 같이 사용하는 것이 더 좋습니다.mode & ~umask
PSkocik의 답변에서, 또는 chmod =rw
(또는 chmod =rwx
디렉토리의 경우) 표준 지정 umask를 적용합니다.ilkkachu가 댓글에서 지적했듯이.
umask
어떤 경우에는 0666
파일과 디렉터리에서 간단히 권한을 빼서 0777
기본 권한을 얻을 수도 있습니다.
$ printf "%04d\n" "$((0777 - $(umask)))"
0755
$ printf "%04d\n" "$((0666 - $(umask)))"
0644
따라서 다음을 신청할 수 있습니다 chmod
.
chmod $((0666 - $(umask))) file
chmod $((0777 - $(umask))) directory
Bash에서는 다음을 사용하여 8진수 출력을 강제해야 합니다 printf
.
$ printf "%04d\n" "$((0777 - $(umask)))"
0493
$ printf "%04o\n" "$((0777 - $(umask)))"
0755
또 다른 방법은 새 파일과 디렉터리를 만들고 이를 참조로 사용하는 것입니다.
touch file2
mkdir directory2
chmod --reference=directory2 directory
chmod --reference=file2 file
답변2
마스킹은 마스크를 통해 AND
비트 단위로 적용되므로 bitwise negated
자신만의 최종 권한 패턴을 만들고 싶다면 다음을 수행할 수 있습니다.
$((mode & ~umask))
다음 주소로 전달할 수 있도록 8진수로 다시 인쇄해야 합니다 chmod
.
$ chmod `printf '%o' $((0777 & ~$(umask)))` directory
$ chmod `printf '%o' $((0777 & ~0111 & ~$(umask)))` file
#^additional implicit mask of 0111 for files
여기서 0777은 마스크를 적용할 권한 모드입니다(사용하거나 stat -c %a file
가져올 수 있음 stat -c %a directory
).
위 내용을 에코하여 프로세스 대체 계산을 확인할 수 있습니다(of의 경우 umask
합계 를 0022
얻습니다 ).755
644
이를 사용하여 일반 함수를 만들 수 있습니다.
#takes a umask as first param and applies it to each folowing param (files)
maskMode(){
local mask="$1" dmask mode a
dmask="$((mask & ~0111))"; shift
for a; do
mode=0`stat -c "%a" "$a"`
chmod `printf "%0.4o\n" $(($mode & ~mask))` "$a"
done
}
특정 용도의 경우 참조 파일을 chmod하는 것도 또 다른 옵션입니다.
답변3
현재 디렉토리를 통해 재귀적으로 실행하려면 -
chmod -R $((777 - `umask`)) .
chmod -R -x+X .
`umask`
로 교체하시면 됩니다 $(umask)
.
답변4
재귀 파일 및 디렉터리
상위 디렉터리의 모든 파일과 디렉터리를 재귀적으로 재설정하려는 경우:
sudo find . -type f -print0 | xargs -0 sudo chmod $((0666 - $(umask)))
sudo find . -type d -print0 | xargs -0 sudo chmod $((0777 - $(umask)))
설명하다
다른 답변은 개별 파일과 디렉토리를 별도로 사용하고 재설정하는 방법(또는 둘 다에 하나의 규칙을 반복적으로 적용하는 방법 chmod -R $((0666 - $(umask)))
) 을 보여줍니다 chmod -R $((0777 - $(umask)))
. (좋은 답변입니다. 감사합니다!)
그러다가 내가 찾았어이 답변find를 사용하여 전체 디렉토리에 선택적으로 권한을 적용하는 방법을 보여줍니다.
find . -type f -print0 | xargs -0 chmod 644
이렇게 하면 파일이 재귀적으로 변경되므로
find . -type d -print0 | xargs -0 chmod 755
디렉토리에 적용됩니다.
이러한 답변을 하나로 묶으면 위의 솔루션이 제공됩니다. 이를 위해서는 각각 GNU 버전의 /option이 필요합니다 find
.xargs
-print0
-0
그것이 다른 사람들에게 도움이 되기를 바랍니다!