
rsync 후 파일 소유권과 권한을 수정하기 위해 실행 중인 스크립트가 있습니다. 내 작업을 수행하는 최적의 방법에 대한 질문은 실행 chmod
과 chown
동시에 실행하는 방법이 있는지 궁금합니다 .
내 스크립트의 현재 반복에서는 find
파일을 두 번 보내고 있습니다.
find /var/www/mysite -exec chown www-data:www-data {} \;
find /var/www/mysite -type f -exec chmod 775 {} \;
명령 하나로 권한과 소유자/그룹을 모두 변경할 수 있으면 좋겠다고 생각했습니다. 인터넷 검색을 한 후 그러한 명령, 인수 또는 옵션이 존재하지 않는다는 사실에 놀랐습니다.
각 파일을 두 번 변경 하지 않도록 권한과 소유권을 동시에 변경할 수 있나요 find
?
편집하다커뮤니티 편집이나 게시물 또는 이 질문이 다음과 중복되는 것으로 제안됨"1개의 명령으로 모든 폴더 권한을 변경하세요". 이 질문은 변경에 대해 묻기 때문에 다릅니다.둘 다권한그리고 소유권동시에 권한뿐만 아니라.
답변1
여러 exec 명령을 전달할 수 있습니다.
find /var/www/mysite -exec chown www-data:www-data {} \; \
-type f -exec chmod 775 {} \;
답변2
명령 에 동등한 옵션을 추가할 수 있습니다 rsync
.
rsync <your_options> --chown www-data:www-data --chmod=F775 <source> <destination>
파일과 디렉터리에 접두사 F
in을 사용할 수 있습니다 .--chmod
D
답변3
완전성을 위해xargs파이프라인에서도 모든 종류의 흥미로운 작업을 수행할 수 있습니다.
find . -type f -print0 | xargs -0 -I VAR -- sh -c 'chmod 775 "VAR" && chown www-data:www-data "VAR" '
이는 구분 기호에 null이 포함된 파일 이름(디렉토리 이름 아님) 스트림을 생성하므로 파일 이름의 공백을 처리합니다.
-0
xargs에게 null에 대한 입력을 분리하도록 지시합니다. 대신 "변수 이름"으로
-I VAR
사용하라고 말하고 그 뒤의 모든 것은 각 줄에 대해 실행되는 것입니다.VAR
{}
--
이는 더 읽기 쉬울 수 있지만 이중 배럴 명령을 실행할 때마다 새 셸을 시작합니다.
답변4
각 파일을 두 번 보내는 것이 걱정된다면 find
xargs를 통해 명령 조합을 실행하면 생성되는 포크 수에 대해서도 걱정할 수 있습니다.
사람들은 Perl이 이러한 기본 쉘 명령 중 다수에 해당하는 명령을 가지고 있다는 사실을 종종 잊어버립니다. 이 작업을 수행하는 한 가지 방법은 다음과 같습니다(테스트됨).
find | perl -lne 'chown 1001,1001, $_; -d $_ ? chmod(0755, $_) : chmod(0644, $_)'
당신은숫자uid, gid 및 mode가 있지만 이에 대해 생각해 보십시오.이건 전혀 포크가 안 돼(하나 find
와 하나를 넘어서 perl
).
그리고 그것을 이해하기 위해 Perl을 많이 알 필요도 없습니다.
chown과 chmod는 충분히 명확합니다. -d
셸 [
이나 test
명령과 동일하며 삼항 연산자는 foo ? bar : baz
Perl에 고유하지 않습니다. (보너스로 디렉터리와 파일에 대해 다양한 모드를 사용할 수 있습니다..)
사실 이것은 Perl을 처음 사용하는 경우 설명이 필요할 수 있는 옵션입니다. 조금 단순화되었습니다.
-n
"STDIN의 각 라인에 대해 이것을 한 번 실행하고$_
라인으로 설정"을 의미 합니다.-l
각 줄 끝의 줄 바꿈을 사라지게 만듭니다(그렇지 않으면 의 일부가 되기 때문입니다$_
).-e
아는 사람들에게는 친숙합니다sed
. 이것은 평가/실행할 표현식이라고 말합니다.