폴더 및 모든 상위 디렉토리에 대한 읽기 및 쓰기 권한 설정


18

root까지 디렉토리 subfolderN및 모든 상위 폴더에 대한 사용자의 읽기 및 쓰기 권한을 설정해야합니다 root.

손으로 할 수 있습니다.

$ sudo chmod +rx /root/subfolder1/subfolder2/subfolderN
$ sudo chmod +rx /root/subfolder1/subfolder2
$ sudo chmod +rx /root/subfolder1
$ sudo chmod +rx /root

그러나 N크면 피곤합니다. 하나의 명령으로 자동으로 수행하는 방법?


당신은 정말해야 하지 수 있도록 /root세계 읽을 수 있습니다.
Stéphane Chazelas 2016 년

답변:


23

하위 디렉토리에서 시작하여 위로 이동하면서 쉘에서 쉽게 수행 할 수 있습니다.

f=/root/subfolder1/subfolder2/subfolderN
while [[ $f != / ]]; do chmod +rx "$f"; f=$(dirname "$f"); done;

이것은 f를 설정 한 파일 / 디렉토리로 시작하며 "/"(또는 루프 조건에서 문자열을 설정 한 모든 것)가 나타날 때까지 모든 상위 디렉토리에서 작동합니다. "/"를 chmod하지 않습니다.


펄과 불필요하게 복잡해 졌다는 것을 알았습니다.
terdon

그러나 f상대 경로라면 /어떻습니까? 대신 상대 경로에서 멈추고 싶습니다 .
모든 StackExchange for

@ StéphaneChazelas 감사합니다. 경우 $f이다 foo/bar, 것 $f이제까지로 변경 .? 네 그렇습니다 dirname. 감사합니다
StackExchange의 모든

1
@Tim은 "f =`readlink -f <relative_path>`"명령을 사용하여 f에 저장하기 전에 상대 경로를 절대 경로로 변환합니다.
Talespin_Kit

6

csh, tcsh, ksh, zsh, bash, fish또는 yash -o braceexpand:

sudo chmod +rx /root{,/subfolder1{,/subfolder2{,/subfolderN}}}

zsh:

f=/root/subfolder1/subfolder2/subfolderN
until [[ $f = / ]] {chmod +rx $f; f=$f:h;}

또는 다음과 같은 glob 한정자 함수를 정의 할 수 있습니다.

explode() {
  reply=()
  until [[ $REPLY = [./] ]] {
    reply+=$REPLY
    REPLY=$REPLY:h
  }
}

예를 들어 다음과 같이 사용하십시오.

$ echo chmod +rx subfolder1/subfolder2/subfolderN(+explode)
chmod +rx subfolder1 subfolder1/subfolder2 subfolder1/subfolder2/subfolderN  

참고 chmod +rxumask에 의해 영향을 받는다. 을 umask포함하지 않으면 디렉토리를 세계에서 읽을 수 있고 액세스 가능 007하게 만들 /root수 있습니다. /root일반적으로 수퍼 유저의 사적인 것이므로 노출하는 것은 좋지 않습니다.


선도 기업의 역할 ,에 대해 설명해 주 {,/subfolder}시겠습니까?
terdon

첫 번째 문자열이 비어 있고 두 번째 문자열이 /subfolder; 그래서 /root{,/subfolder}생산 /root/root/subfolder
tripleee

특히이는 하지 POSIX 휴대용sh
tripleee은

2

글쎄, 당신은 다음과 같이 약간 더 복잡한 것을 할 수 있습니다 :

echo "/root/subfolder1/subfolder2/subfolderN" | 
 perl -anF'/' -e 'while($#F>0){@b=join("/",@F);`chmod +rx @b`; pop @F}' 

이 작업을 확인하려면 chmod통화를 인쇄로 교체하십시오 .

$ echo "/root/subfolder1/subfolder2/subfolderN" | 
 perl -alnF'/' -e 'while($#F>0){@b=join("/",@F);print "chmod +rx @b"; pop @F}' 
chmod +rx /root/subfolder1/subfolder2/subfolderN
chmod +rx /root/subfolder1/subfolder2
chmod +rx /root/subfolder1
chmod +rx /root

1

나는 당신이 무엇을하려고하는지 모르지만 재귀를 가볍게하지 않는 것보다 낫습니다 . 실제 답변을 읽으십시오.

음 ... 왜 재귀를 사용하지 않습니까?

sudo chmod -R +rx /root

또는 마음에 들지 않으면 chmod여러 디렉토리를 제공 할 수 있습니다 .

sudo chamod +rx /root /root/subfolder1 /root/subfolder1/subfolder2 /root/subfolder1/subfolder2/subfolderN

4
그러나 그것은 거의 같은 작업이 아닙니다. chmod -R /root변경 모두 에서 /root일반 파일과 모든 디렉토리를 포함하여 -. 문제는 하나의 디렉토리 체인 만 변경하는 것입니다.
200_success

@ 200_success 그러나 그것은 유일한 대답은 아닙니다;)
Braiam

문제는 재귀에 관한 것이 아니라 하위 폴더에 선택적으로 액세스 할 수 있도록 상위 폴더 체인에 대한 권한을 설정하는 방법입니다. 그것이 유일한 해결책은 아니라고 말하는 것은 벽을 통해 버스를 운전하는 것이 문을 만드는 또 다른 방법이라고 말하는 것과 같습니다.
jmc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.