
.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가 해당 디렉토리로 재귀하여 거기에 있는 모든 파일의 권한을 변경합니다.chmod
chmod -Rv ... *' '*.html
*
html
chmod
답변2
find
"공백이 있는 파일 이름"에는 및 가 필요합니다 xargs
. 을 읽고 man find xargs
다음과 같이 수행하십시오.
find . -type f -name '*.html' -print0 | \
xargs -0 -r echo chmod u=rwx,g=r,o
echo
효과가 있으면 " "을(를) 제거하세요 .