chmod 명령을 선택적으로 사용


11

특정 디렉토리 아래의 모든 파일 및 하위 디렉토리에 755 권한을 설정하고 싶지만 755 권한이없는 구성 요소에 대해서만 chmod 755를 실행하려고합니다.

find /main_directory/ -exec chmod 755 {} \;

은 IF find명령은 긴 목록을 반환,이 시간이 많이 걸릴 것입니다. stat 명령을 사용하여 각 구성 요소의 Octal 파일 수준 권한을 확인한 다음 if-else를 사용하여 파일 권한을 전환 할 수 있지만 파일 / 디렉토리의 권한을 사용 find하고 xargs먼저 확인하는 단일 행 접근법이 있습니까? 다음 사용 chmod이 다른 것으로 설정되어있는 경우 755로 변경.


6
이는 조기에 최적화 된 것일 수 있으며 더 빠를 수도 있습니다. 이러한 검사를 모두 수행하면 속도가 느려질 수 있습니다. 더 빠른지 확인하기 위해 테스트하면 많은 작업을 수행 해야하는 경우에만 보상됩니다.
ctrl-alt-delor

3
모든 파일에 실행 권한을 부여하고 싶지 않을 수 있습니다. 보안상의 위험이 있습니다. (이것은 Microsoft Windows의 바이러스 벡터 중 하나입니다. 모든 것이 실행 가능합니다). 기호 모드에서는 다음과 같이 말할 수 있습니다 u+rw,go+r,go-w,ugo+X. 수도에 주목하십시오.
ctrl-alt-delor

@ ctrl-alt-delor에 동의하지만 같은 것을 달성 해야하는 u = rwX, go = rX에 더 가까운 것을 제안 할 것입니다.
penguin359

답변:


21

755파일과 디렉토리 모두 에 대한 권한을 변경하려는 경우 find(적어도 성능 관점에서) 사용하면 실질적인 이점이 없으며 수행 할 수 있습니다.

chmod -R 755 /main_directory

ctime 타임 스탬프 업데이트를 피하기 위해 find이미 권한이있는 항목에 대한 권한 변경을 피하기 위해 실제로 사용 하려면 755각 디렉토리 및 파일에 대한 현재 권한도 테스트해야합니다.

find /main_directory ! -perm 0755 -exec chmod 755 {} +

이 테스트 -exec ... {} +! -perm 0755테스트 를 통과 한 경로 이름을 가능한 한 많이 수집하고 모든 경로 이름 chmod을 한 번에 실행 합니다.

일반적으로 파일과 디렉토리에 대한 권한을 개별적으로 변경하여 모든 파일이 실행 가능한 것은 아닙니다.

find /main_directory   -type d ! -perm 0755 -exec chmod 755 {} +
find /main_directory ! -type d ! -perm 0644 -exec chmod 644 {} +

매력처럼 일했습니다. 감사합니다. 감사합니다. Kumarjit
Kumarjit Ghosh

1
+대신에 ;사용하는 것이 큰 차이가 있다고 생각 합니다.
Kevin

이것은 빠른 방법입니다. 점검을 피하십시오. find를 사용하여 변경 권한이있는 파일 만 목록을 작성하면 변경 할 수없는 파일에서 chmod 오류가 발생하지 않습니다. <pre> <code> # rwx, rw, wx, w 만 찾을 수 있습니다. -user $ (whoami) -perm / 002! -perm 0755 -exec chmod 0755 {} \; # 두 개의 작업을 찾습니다. -user $ (whoami) -perm / 002! -perm 0755> $ (</ tmp / chfiles.txt)의 파일에 대한 /tmp/chfiles.txt do chmod --quiet 0755 "$ {file}"완료 </ code> </ pre>
Chris Reid

@ChrisReid 경로 이름에 공백 문자가 포함 된 경우 이와 같은 경로 이름 목록을 반복하면 중단됩니다.
Kusalananda

스크립트에서 내부 필드 구분 기호 (IFS)를 '\ n'으로 변경해야한다고 생각합니다. 이것은 환경 설정이며, 쉘이 해석하는 방식은 해당 설정 값에 따라 다릅니다. 파일 이름 바꾸기 또는 덮어 쓰기와 같은 끔찍한 재해를 제거하기 위해 더미 파일에서 스크립트를 테스트합니다. IFS를 설정하는 쉘 printf 방식이 마음에 듭니다. IFS = $ (printf "\ n") # 매우 읽기 쉬운
Chris Reid

1

으로는 find입수했습니다 -exec ... +이 사용에 많은 포인트가 아니라, 구문을 xargs당신이 그것을 요청으로 만 :

find /main_directory -not -perm 0755 | xargs chmod 755

1
또한 잠재적 인 공격자가 공백이나 다른 특수 문자를 포함하는 파일 이름을 만들 수있는 경우 -0( x86 -print0은 GNU 확장 인 find 와 함께) xargs를 사용 하면 보안 상 문제가 될 수 있습니다. -exec당신이 할 수있을 때 그래서 더 나은 스틱
Matija Nalis

에 대한 필요가 xargs(단지 사용 -exec당신이 그것을 사용하는 경우에), 당신은 사용 안 -print0/ -0마티 말한다처럼.
Kevin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.