현재 디렉터리와 모든 하위 디렉터리의 일부 파일에 대한 권한을 변경할 때 공백이 포함된 파일 이름을 처리하는 방법은 무엇입니까?

현재 디렉터리와 모든 하위 디렉터리의 일부 파일에 대한 권한을 변경할 때 공백이 포함된 파일 이름을 처리하는 방법은 무엇입니까?

.html현재 현재 디렉터리와 모든 하위 디렉터리에 있는 확장자를 가진 모든 파일을 소유자가 읽고, 쓰고, 실행할 수 있도록 설정하고, 그룹과 다른 사람만 읽을 수 있도록(쓰기 또는 실행 가능하지 않음) 설정 하려고 합니다 . 그러나 일부 파일에는 이름에 공백이 있어서 어떻게 처리해야 할지 모르겠습니다.

내 첫 번째 시도:

chmod -Rv u+rw,go+r '* *.html'

처음 시도하면 다음과 같은 메시지가 나타납니다.

chmod: cannot access '* *.html': No such file or directory
failed to change mode of '* *.html' from 0000 (---------) to 0000 (---------)

두 번째 시도:

find . -type f -name "* *.html" | chmod -Rv u+rw,go+r

find명령의 출력 을 chmod.

chmod: missing operand after ‘u+rw,go+r’

시도한 후에도 설정된 권한을 반복적으로 변경하기 위해 파일 이름의 공백을 처리하는 방법에 대해 여전히 혼란스럽습니다. 이 문제를 처리하는 가장 좋은 방법은 무엇입니까? 어떤 피드백이나 제안이라도 대단히 감사하겠습니다.

답변1

-exec술어 사용 find:

find . -name '* *.html' -type f -exec chmod -v u+rw,go+r {} +

rw-r--r--(여기서는 html 파일에 실행 권한을 추가하는 것이 거의 의미가 없기 때문에 권한만 추가합니다. 이러한 권한은 일반적으로 실행되도록 의도되지 +않습니다 .=놓다이러한 권한은 완전히 대체됩니다.다음에 추가이 비트는 현재 권한에 적용됩니다).

이미 (적어도) 이러한 권한이 있는 파일을 건너뛰기 ! -perm -u=rw,go=r전에 추가 할 수도 있습니다 .-exec

와 함께sfind구현하다find(이것도 find내장되어있습니다.bosh껍질-chmod), 술어 뒤에 -chfile(변경사항 적용)을 사용할 수 있습니다 .

sfind . -name '* *.html' -type f -chmod u+rw,go+r -chfile

( 이미 올바른 권한이 있는 파일을 건너뛰기 위해 ! -perm...이미 sfind추가 할 필요가 없습니다 .)-chfile

이는 새 프로세스의 각 파일에 대해 별도의 명령을 실행하지 않고 각 파일의 전체 경로를 두 번 조회하는 것을 방지하기 때문에 가장 효율적입니다 (파일의 상대 경로 로 chmod 시스템 호출 호출). 디렉토리 크롤링 중에 발견됩니다. 즉, 해당 디렉토리로 이어지는 모든 경로 구성요소를 다시 찾을 필요가 없습니다.sfindchmod()sfindchmod()

그리고 zsh:

chmod -v -- u+rw,go+r **/*' '*.html(D.)

여기서는 쉘의 재귀 와일드카드를 사용합니다 D.. 글로벌 예선숨겨진 파일을 개별적으로 포함하고 다음으로 제한합니다.정기적인파일 (그렇습니다 -type f). 추가하면 ^f[u+rw,go+r]이미 이러한 권한이 있는 파일을 건너뛸 수도 있습니다.

glob에는 chmods를 사용할 수 없습니다 . 와일드카드는 와 -R일치하지 않고 셸에 의해 확장되므로 ( 셸이 와일드카드 연산자로 해석하려면 따옴표를 풀어야 함) 파일 목록을 에 전달할 수 있으며 그 안에 있는 파일 중 디렉터리인 경우에만 가능합니다. chmod를 재귀적으로 해당 파일에 추가하고 그 안에 있는 모든 파일의 권한을 변경합니다.chmodchmod -Rv ... *' '*.html*htmlchmod

답변2

"공백이 있는 파일 이름"에는 find및 가 필요합니다 xargs. man find xargs다음을 읽고 수행하십시오.

find . -type f -name '*.html' -print0 | \
    xargs -0 -r echo chmod u=rwx,g=r,o

echo효과가 있으면 " "을(를) 제거하세요.

관련 정보