디렉토리가 아닌 파일에서 실행 비트를 재귀 적으로 제거하는 방법


답변:


132

GNU chmod(Ubuntu) 단일 명령 변형 (현재 디렉토리에서 시작)을 사용하는 경우 :

chmod -R -x+X .

설명:

  • -R -재귀 적으로 작동
  • -x -모든 사용자에 대한 실행 플래그 제거
  • +X -디렉토리 인 경우 모든 사용자에 대해 실행 가능 플래그 설정

이 경우 X모든 실행 가능 플래그가에 의해 지워 지므로 대문자 는 디렉토리에만 적용됩니다 -x. 그렇지 않으면 +X, 플래그가 원래 사용자, 그룹 또는 기타에 대해 설정된 경우에도 실행 가능 플래그를 설정합니다.

BSD chmod(Mac OS X에 있음)를 사용하면 두 가지 명령으로 별도로 수행해야합니다.

sudo chmod -R -x * && sudo chmod -R +X *

(메인 디렉토리에도 숨겨진 파일을 포함 시키려면 *를. (포인트)로 변경해야하지만 테스트되지는 않았습니다.)


우분투 13.04에서 약간의 조정이 필요합니다.chmod -R a-x+X *
Eero Aaltonen

@EeroAaltonen : 감사합니다. 귀하의 모든 권한을 umask허용하지 않는 경우 발생할 수 있습니다 x. 기본값을 사용 umask하거나 변경 했습니까? umask명령 출력을 보내 주 시겠습니까? : 솔루션 외에도이 가능성도있다 chmod -R a-x,+X *설정된 것입니다 x당신에 따라 권한 umask. 답변을 업데이트하지만 먼저 BSD / Mac OS X의 동작을 확인하고 싶습니다.
pabouk

@pabouk oopsie! 실제로 내가 0007. 내 umask를 설정했던 가상 코어 상자이었다
Eero 알토 넨

이것은 슬프다 ... :( 저는 findOne Thing Well을 수행하는 간단한 도구를 결합하는 스타일이기 때문에 아래 답변 의 변형을 좋아합니다 .
mikezter

2
이것을 모든 파일에 적용 하려면 .대신 사용하십시오*
John Magnolia

46

올바른 경로를 먼저 입력 한 경우 :

find . -type f -exec chmod -x {} \;

또는

chmod -x $(find . -type f)

find는 경로에서 'f'유형 (일반 파일을 의미 함)의 모든 파일을 찾습니다. 그런 다음 각 파일에서 chmod -x를 호출합니다. {}는 파일 이름과 \로 대체됩니다. chmod 명령을 종료합니다.


6
find지원하는 경우 -exec ... \+대신 대신 사용 하십시오 . + -exec ... \;가 더 적습니다 . 그렇지 않으면을 사용하십시오 . forkexecfind ... -print0 | xargs -0 ...
ephemient

5
이 기법을 사용했지만 찾기에 "-perm +111"을 추가하여 x-bit 세트를 가진 chmod의 것만 추가했습니다.find . -type f -perm +111 -exec chmod -x {} \;
chrish

4
+1 @Matthijs 이것이 pabouk의 솔루션보다 좋은 이유는이 명령이 디렉토리 만 남겨두고 pabouk이 모든 디렉토리에서 실행 가능 비트를 재설정하기 때문입니다. 실행 비트가 설정되지 않은 일부 디렉토리가있을 수 있으며 pabouk의 명령이 설정 한 반면, 그대로두기를 원할 수 있습니다.
MariusMatutiae

공백이 포함 된 경로의 경우 두 번째 접근 방식이 실패합니다.
MestreLion

@ephemient : 당신의 find지원 이라면 -print0나는 또한 그것을 지원할 것이라고 확신합니다-exec
MestreLion

3

터미널 윈도우의 Linux 및 Unix 또는 Mac OS X의 경우 Terminal.app에서이를 사용하십시오.

find . -type f -print0 | xargs -0 chmod -x

1
이것은 본질적으로 2011 년의 Matthijs P의 답변과 다르지 않습니다.
slhck

이 명령 줄을 기억할 수 있습니까? 난 못해
Mike L.

이 답변이 왜 유용한 지 알아 보려면 Matthijs의 답변 아래에서 ephemient의 의견을 참조하십시오.
PatrickT

2

chmod -x+X방법 중 하나 우분투에 나를 위해 작동하지 않았다, 따라서 나는이 최소한의 파이썬 스크립트를 썼다 :

#!/usr/bin/python3
import os
for par, dirs, files in os.walk('.'):
    for d in dirs:
        os.chmod(par + '/' + d, 0o755)
    for f in files:
        os.chmod(par + '/' + f, 0o644)

파일 시스템에 소켓과 같은 멋진 추가 기능이 있으면 마지막 chmod를 try / catch로 둘러 쌀 수 있습니다.

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