.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
s를 사용할 수 없습니다 . 와일드카드는 와 -R
일치하지 않고 셸에 의해 확장되므로 ( 셸이 와일드카드 연산자로 해석하려면 따옴표를 풀어야 함) 파일 목록을 에 전달할 수 있으며 그 안에 있는 파일 중 디렉터리인 경우에만 가능합니다. 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
효과가 있으면 " "을(를) 제거하세요.