INCLUDE/EXCLUDE PATTERN RULES
매뉴얼 페이지 섹션 에는 다음과 같이 나와 있습니다.
패턴이 /로 시작하면 파일 계층의 특정 위치에 고정되고, 그렇지 않으면 경로 이름의 끝과 일치합니다. 이는 정규 표현식의 앞에 있는 ^와 유사합니다. 따라서 "/foo"는 "전송 루트"(전역 규칙의 경우) 또는 병합된 파일 디렉터리(디렉터리별 규칙의 경우)의 "foo" 이름과 일치합니다. 정규화되지 않은 "foo"는 알고리즘이 위에서 아래로 재귀적으로 적용되기 때문에 트리의 어느 위치에서든 "foo" 이름과 일치합니다. 마치 각 경로 구성 요소가 차례로 파일 이름 끝에 있는 것처럼 동작합니다. 고정되지 않은 "sub/foo"라도 "sub"라는 디렉터리에서 "foo"가 발견되는 계층 구조의 모든 지점과 일치합니다. 전송 루트에서 일치시킬 패턴을 지정하는 방법에 대한 자세한 내용은 "앵커 포함/제외 패턴" 섹션을 참조하세요.
디렉터리별 규칙을 지정하는 방법은 무엇입니까? 어떤 영향을 미칠까요?
답변1
편집자 의견: 다음은 매뉴얼의 "디렉터리별 규칙 및 제거" 섹션을 그대로 복사한 것입니다 rsync(1)
.
삭제 옵션이 없으면 디렉터리별 규칙은 전송 측에만 관련되므로 전송에 영향을 주지 않고 병합된 파일 자체를 자유롭게 제외할 수 있습니다. 예를 들어:
rsync -av --filter='dir-merge /.rsync-filter' --exclude=.excl host:src/dir /dest
rsync -av --filter='dir-merge /.rsync-filter' host:src/dir /dest
--filter='dir-merge /.rsync-filter' This tells rsync to look for per-directory .rsync-filter files that have
been sprinkled through the hierarchy and use their rules to filter the files in the transfer. If -F is repeated, it is a shorthand for this rule:
그러나 수신측에서 삭제를 수행하고 특정 파일이 삭제되지 않도록 제외하려는 경우 수신측에서 제외할 파일을 알고 있는지 확인해야 합니다. 가장 쉬운 방법은 전송에 "디렉터리당 파일 병합"을 포함하고 --delete-after를 사용하는 것입니다. 이렇게 하면 수신자가 항목을 삭제하기 전에 발신자와 동일한 제외 규칙을 얻게 됩니다.
rsync -avF --delete-after host:src/dir /dest
그러나 파일이 전송의 일부가 아닌 경우 일부 전역 제외 규칙(예: 명령줄에서)을 지정하거나 수신 측에서 자체 디렉터리별 파일을 유지해야 합니다. 첫 번째 예는 다음과 같습니다(원격 .rules 파일이 자신을 제외한다고 가정).
rsync -av --filter='remote .rules' --filter='remote /my/extra.rules'
--delete host:src/dir /dest
위의 예에서 extra.rules 파일은 전송의 양쪽 모두에 영향을 미칠 수 있지만 규칙(보내는 쪽)은 각 디렉터리 병합 규칙 다음에 지정되므로 .rules 파일에서 병합된 규칙의 적용을 받습니다.
마지막 예에서 원격 측은 전송에서 .rsync-filter 파일을 제외하지만 우리는 자체 .rsync-filter 파일을 사용하여 수신 측에서 제거하는 항목을 제어하려고 합니다. 이렇게 하려면 각 디렉터리에 대해 병합된 파일을 구체적으로 제외해야 하며(삭제되지 않도록) 그런 다음 삭제해서는 안 되는 다른 항목을 제어하는 규칙을 로컬 파일에 넣어야 합니다. 다음 명령 중 하나와 같습니다.
rsync -av --filter=':e /.rsync-filter' --delete \
host:src/dir /dest
rsync -avFF --delete host:src/dir /dest