폴더를 건드리지 않고 파일에서 실행 권한을 재귀 적으로 제거하는 방법은 무엇입니까?


40

NTFS 드라이브에 백업을했는데이 백업이 실제로 필요한 것으로 판명되었습니다. 그러나 NTFS 드라이브가 권한을 엉망으로 만들었습니다. 각각의 모든 파일을 수동으로 수정하지 않고 일반으로 복원하고 싶습니다.

한 가지 문제는 갑자기 모든 텍스트 파일이 실행 권한을 얻었고 이는 잘못된 것입니다. 그래서 나는 시도했다 :

sudo chmod -R a-x folder\ with\ restored\ backup/

그러나 x디렉토리 에서 권한을 제거하여 읽을 수 없게 만드는 것은 잘못 입니다.

이 경우 올바른 명령은 무엇입니까?


1
메타 : 유닉스 시스템이 왜 DOS 나 Windows 파일 시스템에서 마운트 된 파일에 실행 비트를 추가하는지 이해하지 못했습니다. 다른 사람들이 그 파일을 실행하는 것과는 다릅니다. 나는 일반적으로 마운트 옵션에 "noexec"를 추가한다.
Edward Falk

답변:


68
chmod -R -x+X *

-x제거합니다 모든 권한 실행
(가) +X하지만, 모든 실행 권한을 추가합니다 에만 디렉토리.


2
나는 결국 chmod -R a-x + X, u-x + rwX, go-wx + rX directory / name 명령을 사용하여 권한을 복원하는 데 사용한 명령
gaazkam

3
또한 BSD 예외에 대한 Edward의 답변
fikr4n

4
"폴더를 건드리지 않고"요구 사항이 실패합니다. 일부 디렉토리에서 실행 (세계적으로)이 의도적으로 제거 된 경우 어떻게됩니까? 추가해서는 안됩니다.
Ben Voigt

4
이것은 Mac에서 작동하지 않았습니다. -R 플래그를 처음으로 이동하면 Linux 및 Mac 터미널에서 모두 작동합니다. chmod -R -x+x *
JoeMoe1984

2
실제로 올바른 순서로 OSX에서 실행되지만 실제로 원하는 효과는 없습니다. 다음 두 단계로 수행해야합니다.chmod -R -x * && chmod -R +X *
Timmmm

14

저는 Mac OS X, BSD, Linux에 대한 "chmod"매뉴얼 페이지를 다시 읽고 몇 가지 실험을했습니다. 다음은 상징적 모드에 대해 배운 내용입니다. 복잡해질 수 있지만 이해할 가치가 있습니다.

  • 일반적인 형식은 조항 [, 조항 …]입니다. 여기서 :
  • 조항 : = [ugoa] [+-=] [rwxXstugo]
  • [ugoa] ( who ) (복수 지정)는 사용자, 그룹, 기타 또는 모두에 대한 권한을 설정하는 것을 의미합니다. 지정하지 않으면 기본값은 'a'이지만 umask 는 적용됩니다.
  • [+-=] ( action ) (하나 지정)는 다음을 의미합니다.
    • +는 지정된 권한을 이미 유효한 권한에 추가 함을 의미합니다.
    • -이미 유효한 권한에서 지정된 권한을 제거합니다.
    • =는 권한을 지정된 권한으로 설정하고 다른 모든 권한을 지우는 것을 의미합니다.
  • [rwxXstugo] ( permission ) (rwxXst의 배수 또는 ugo 중 하나 지정)는 다음과 같이 지정된 사용자의 권한을 설정합니다.
    • r — 읽기
    • w — 쓰기
    • x — 실행 / 검색
    • X — 디렉토리 실행 또는 검색 또는 실행 비트가 이미 설정되어 있습니다.
    • s — suid 또는 sgid
    • t — 끈적임
    • u — 사용자 권한 복사
    • g — 그룹 복사 권한
    • o — 다른 허가 복사

예를 들어, a+x모든 사람이 파일을 실행 가능하게 만듭니다. a+X누군가가 실행할 수 있다면 모든 사람이 파일을 실행 가능하게 만듭니다.

a+x모든 사람이 디렉토리를 검색 할 수있게합니다. a+X또한 모든 사람이 디렉토리를 검색 할 수있게합니다.

BSD와 Linux의 주요 차이점은 BSD에서는 chmod가 실행 되기 전에 파일의 권한에 따라 결정된다는 것입니다 . Linux에서는 + X 절이 실행되기 직전에 결정됩니다.

따라서 BSD와의 조합 a-x,a+X은 실행 / 검색 권한을 제거한 다음 모든 사람이 디렉토리를 검색 할 수있게하고 누군가가 원래 실행 가능했던 경우 모든 사람이 파일을 실행할 수있게합니다 .

Linux를 사용하면 a-x,a+X실행 / 검색 권한을 제거한 다음 모든 사람이 디렉토리를 검색 할 수있게하고 아무도 파일을 실행할 수 없게합니다.


구체적인 예는 다음과 같습니다. BSD 시스템 : 디렉토리, 실행 파일 및 비 실행 파일 :

drwxr-x---  2 falk  staff  68 Jul 19 18:01 fee/
-rwxr-x---  1 falk  staff   0 Jul 19 18:01 fie*
-rw-r-----  1 falk  staff   0 Jul 19 18:01 foe

디렉토리와 "fie"는 모두 사용자가 실행할 수 있고 검색 할 수 있지만 다른 사용자는 실행할 수 없습니다.

이제 우리는 실행 chmod a-x,a+X *합니다. 첫 번째 절은 모든 파일에 대해 모든 사용자의 실행 / 검색 비트를 제거하지만 두 번째 절은 "fee"및 "fie"에 대해 다시 추가합니다. "fee"는 디렉토리이기 때문에 "fie"이고 적어도 하나의 실행 가능한 비트가 있기 때문에 "fie"입니다.

drwxr-x--x  2 falk  staff  68 Jul 19 18:01 fee/
-rwxr-x--x  1 falk  staff   0 Jul 19 18:01 fie*
-rw-r-----  1 falk  staff   0 Jul 19 18:01 foe

나는 같은 결과를 실행했다 chmod -x+X.

결론 : Jak Gibb의 솔루션은 Linux에서 작동하지만 BSD의 경우 두 단계를 거쳐야합니다.

SVr4 또는 다른 Unix 변형에서는 이것을 테스트하지 않았습니다.


잘 읽었습니다. 이것에 대해 조사해 주셔서 감사합니다.
Jak Gibb

10

그것을하는 한 가지 방법 :

find backup -type f -exec chmod 0644 {} +

6
변경하지 않으려는 권한을 추가하거나 제거 할 수 있습니다. 더 나은 사용법chmod a-x {}
Edward Falk

1
@EdwardFalk chmod a-x {}는 또한 변경하고 싶지 않은 권한을 제거하여 파일을 세계적으로 쓸 수있게 할 수 있습니다. 요점은 0644는 "일반적으로 합리적인"타협입니다. 물론 OP는 컴퓨터에서 인터넷의 솔루션을 적용하기 전에 두뇌에 관여해야합니다.
사토 카츠라

4
"ax"는 사용자, 그룹, 기타에 대한 실행 권한을 제거하고 내가 아는 한 다른 권한은 변경하지 않습니다. 내가 틀렸어?
Edward Falk

1
@EdwardFalk 아니, 맞아. 그러나 파일 세트가 실제로 무엇인지 알지 못하며 이전의 사용 권한이 무엇인지 알지 못합니다 chmod. 백업 파일에 스크립트와 바이너리가 포함되어 있으면 제거 x가 잘못되었습니다. 이전의 사용 권한 chmod이 0777 인 경우 chmod a-x여전히 사용 권한을 0666으로 남겨두고 원하는 것은 아닙니다. 내가 말하는 것은 chmod 0644더 나은 휴리스틱이라는 것이지 chmod a-x잘못이 아닙니다 .
사토 카츠라

1
@NajibIdrissi 유닉스 권한이없는 외부 파일 시스템에서 복사했을 때를 제외하고는 0777로 변경되었다. 바로 OP가 한 일입니다.
사토 카츠라

6
 find backup ! -type l ! -type d -exec chmod a-x {} +

디렉토리 유형 (요청한대로) 이 아닌 파일 또는 심볼릭 링크 (심볼릭 링크는 일반적으로 항상 rwxrwxrwx chmod이며 파일의 심볼릭 링크 대상에 영향을 미침)에 대한 실행 권한을 제거 합니다.

참고 :

 find backup -type f -exec chmod a-x {} +

일반 파일 의 권한 만 변경 합니다. 제외 할 그 디렉토리심볼릭 링크 뿐만 아니라 장치 , 명명 된 파이프 , 소켓 (A NTFS 파일 시스템의 백업의 영업 이익의 경우, 사람들은 존재하지 않을 것입니다하지만) 시스템에 따라 그리고 아마도 다른 사람을.


2

zsh에서는 glob 한정자 . 를 사용하여 일반 파일 (심볼릭 링크는 포함하지 않음) 만 D일치 시키고 도트 파일은 일치 시킵니다 .

sudo chmod a-x folder\ with\ restored\ backup/**/*(D.)

명령 행이 너무 길면 다음을 사용할 수 있습니다 zargs.

zargs -- folder\ with\ restored\ backup/**/*(D.) -- sudo chmod a-x 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.