chmod와 chown을 동시에?

chmod와 chown을 동시에?

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>

파일 및 디렉토리에 접두사 in을 사용할 수 있습니다 F.--chmodD

답변3

완전성을 위해매개변수파이프라인에서는 모든 종류의 흥미로운 작업을 수행할 수도 있습니다.

find . -type f -print0 | xargs -0 -I VAR -- sh -c 'chmod 775 "VAR" && chown www-data:www-data "VAR" '

이는 빈 구분 기호가 있는 파일 이름(디렉터리 이름이 아님) 스트림을 생성하므로 파일 이름의 공백을 처리합니다.

-0xargs에게 null에 대한 입력을 분리하도록 지시합니다. 각 줄에서 실행되는 것 이후의 모든 것 대신 "변수 이름"
-I VAR으로 사용된다고 말합니다.VAR{}
--

이는 더 읽기 쉬울 수 있지만 이중 배럴 명령을 실행할 때마다 새 셸을 시작합니다.

답변4

각 파일 에 대해 두 번 걱정하는 경우 findxargs를 통해 명령 조합을 실행하여 발생하는 포크 ​​수에 대해서도 걱정해야 할 것입니다.

사람들은 Perl이 이러한 기본 쉘 명령 중 다수와 동등한 기능을 가지고 있다는 사실을 종종 잊어버립니다. 내가 수행하는 한 가지 방법은 다음과 같습니다(테스트됨).

find | perl -lne 'chown 1001,1001, $_; -d $_ ? chmod(0755, $_) : chmod(0644, $_)'

당신은 사용해야합니다숫자uid, gid 및 mode이지만 다음 사항을 고려하십시오.이건 전혀 포크되지 않습니다find(하나 와 하나를 넘어 perl).

그리고 Perl을 이해하기 위해 Perl을 많이 알 필요는 없습니다.

chown 및 chmod는 이미 명확합니다. 쉘이나 command 와 동일하며 -d삼항 연산자는 Perl에 고유하지 않습니다. ([testfoo ? bar : baz보너스로 디렉터리와 파일에 대해 다양한 모드를 사용할 수 있습니다..)

실제로 Perl을 처음 사용하는 경우 이러한 옵션을 설명해야 할 수도 있습니다. 조금 단순화하려면 다음을 수행하십시오.

  • -n"STDIN의 각 라인에 대해 한 번 실행하고 $_해당 라인으로 설정"을 의미합니다 .
  • -l각 줄 끝의 개행 문자를 사라지게 만듭니다(그렇지 않으면 의 일부가 되기 때문입니다 $_).
  • -e아는 사람이라면 누구나 익숙할 것입니다 sed. 이는 평가/실행할 표현식이라고 말합니다.

관련 정보