현재 디렉터리와 모든 하위 디렉터리에 있는 특정 파일에 대한 권한을 변경할 때 공백이 포함된 파일 이름을 어떻게 처리합니까?

현재 디렉터리와 모든 하위 디렉터리에 있는 특정 파일에 대한 권한을 변경할 때 공백이 포함된 파일 이름을 어떻게 처리합니까?

.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 이는 매우 많은 파일마다 새 프로세스에서 별도의 명령을 실행하지 않고 모든 파일의 전체 경로를 두 번 조회하는 것을 방지하기 때문에 가장 효율적입니다 ( 파일 경로로 시스템 호출을 sfind호출함). chmod()디렉토리와 관련하여 sfind 크롤링 중에 해당 항목을 찾습니다. 즉, chmod()해당 항목으로 연결되는 모든 경로 구성 요소를 다시 조회할 필요가 없습니다.

와 함께 zsh:

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

여기서는 쉘의 재귀적 글로빙과 D. 글로벌 한정자각각 숨겨진 파일을 포함하고 다음으로 제한합니다.정기적인(그렇습니다 -type f). ^f[u+rw,go+r]이미 해당 권한이 있는 파일을 건너뛰려면 추가하세요 .

이를 위해 glob과 함께 chmod사용할 수 없습니다 . Globs는 와 -R일치하지 않고 셸에 의해 확장되므로 (셸이 globbing 연산자로 해석하려면 따옴표로 묶어야 함) 파일 목록을 에 전달하고 해당 파일 중 하나라도 다음과 같은 경우에만 전달하면 됩니다. 디렉토리는 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효과가 있으면 " "을(를) 제거하세요 .

관련 정보