rsync exclude 디렉토리가 작동하지 않습니다


34

Fedora 17 64 비트를 실행 중이며 rsync --exclude=/home/ben/<dir>예상대로 작동하지 않습니다.

rsync홈 디렉토리에서 썸 드라이브를 시도하고 있지만 캐시 파일과 빌드 파일을 보유하는 디렉토리를 제외하고 싶습니다. 이것이 내가 사용하는 명령입니다.

rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home/ben home-ben/

그러나, 콘텐츠 ~/build및이 ~/.ccache에 의해 복사되는 rsync. 내가 무엇을 잘못하고 있지?


1
제외 패턴이 작동하지 않는다고 생각합니다.
Sören

답변:


37

rsync선행 /으로 시작하는 글로벌 필터 규칙 은 전송 루트에 고정 됩니다. 매뉴얼 페이지의 "INCLUDE / EXCLUDE PATTERN RULES"섹션에서 인용 :

패턴이 /로 시작하면 파일 계층 구조의 특정 지점에 고정되고, 그렇지 않으면 경로 이름의 끝과 일치합니다. 이것은 정규 표현식에서 ^와 비슷합니다. 따라서 "/ foo"는 "전송의 루트"(글로벌 규칙의 경우) 또는 병합 파일의 디렉토리 (디렉토리 별 규칙의 경우)에서 "foo"의 이름과 일치합니다.

명령 ( rsync ... -arv /home/ben home-ben/)에서 파일 /home/ben/foo이 (으 ) 로 전송됩니다 home-ben/ben/foo. 전송 루트는 home-ben이고 올바른 필터 경로는 /ben/foo입니다. 그러므로,

  • 일치 /home/ben/.ccache하려면 필터 경로가 필요합니다./ben/.ccache
  • 일치 /home/ben/build/하려면 필터 경로가 필요합니다./ben/build/

보다 자세한 설명은 rsync(1)매뉴얼 페이지 의 "ANCHORING INCLUDE / EXCLUDE PATTERNS"섹션에서 확인할 수 있습니다 .


단순히 선두를 떠나는 /것이 반드시 원하는 것은 아닙니다. 동일한 매뉴얼 페이지 섹션에서 다시 인용 :

규정되지 않은 "foo"는 알고리즘이 위에서 아래로 재귀 적으로 적용되기 때문에 트리의 어느 곳에서나 "foo"라는 이름과 일치합니다. 마치 각 경로 구성 요소가 파일 이름의 끝이되는 것처럼 작동합니다. 고정되지 않은 "sub / foo"조차 "sub"라는 디렉토리에서 "foo"가 발견 된 계층 구조의 어느 시점에서나 일치합니다. 전송 루트에서 일치하는 패턴을 지정하는 방법에 대한 자세한 내용은 ANCHORING INCLUDE / EXCLUDE PATTERNS 섹션을 참조하십시오.

따라서의 필터 패턴 build/의 빌드 디렉토리 어디서나 일치 것 /home/ben조차 /home/ben/many/sub/directories/build/.


2
주요 세부 사항은 슬래시가 중요하다는 것입니다. 소스 디렉토리 끝에 슬래시 (rsync -a source / destination)를 추가하면 소스의 내용이 복사되고 그렇지 않으면 rsync -a source destination소스 디렉토리 자체가 대상에 복사됩니다. 이는 제외 표현식에 알리기 위해 전송 루트가 무엇인지 결정합니다. 그런 다음 제외 표현식에서 /를 올바르게 사용하는 방법은 위에서 설명했습니다. 특히 rsync --exclude='/dir1' source destination아무것도 배제하지 않습니다.
pgoetz 2016 년

11

나는 당신의 exclude경로가 소스 경로에 상대적이어야 한다고 생각합니다 . 대신 시도해 볼 수 있습니까?

rsync --exclude=build/ --exclude=.ccache -arv /home/ben home-ben/

다음은 비교 테스트입니다.

/tmp$ tree src dest
src
├── a
└── b
dest
└── foo/

/tmp$ rsync -nav --exclude /tmp/src/b /tmp/src /tmp/dest
sending incremental file list
src/
src/a
src/b

$ rsync -nav --exclude b /tmp/src /tmp/dest
sending incremental file list
src/
src/a

2
이 답변은 잘못되었습니다. 상대 제외 경로를 사용하면 어디서나 패턴을 제외 할 수 있습니다!
rubo77

이 게시물이 맞습니다. 일치는 파일 inode 기반이 아니라 텍스트 기반입니다. --verbose명령 출력에 표시되는 경로는 사용해야하는 형식입니다.
Sridhar Sarnobat가

이것은 나를 위해 일했습니다.
Zhenyu

소스 경로가 '/'인 경우 절대 경로는 상대 경로이지만 여전히 작동하지 않습니다.
Sören

이것이 나를 위해 일한 유일한 것입니다.
조나단

2

스크립트 에서이 문제가 발생했습니다 (귀하의 경우인지 모르겠습니다). 스크립트 에서이 명령을 사용하고 bash 대신 sh를 사용했기 때문입니다. 스크립트 시작 부분에서 shebang을 확인하십시오.


1

전체 / home 경로를 재 동기화하면 (예 : 슬래시없이) 제외 패턴이 작동합니다.

rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home home-all/

그러나 마지막 슬래시로 폴더의 내용을 재 동기화하는 것이 좋습니다.

rsync --exclude=/build --exclude=/.ccache -arv /home/ben/ home-ben/

무시 목록을 사용할 수도 있습니다. https://askubuntu.com/questions/545655/backup-your-home-directory-with-rsync-and-skip-useless-folders


0

rsync를 사용하여 특정 폴더를 제외 시키려면 명령에서 상대 경로를 고려해야합니다. 당신의 경우 :

rsync --exclude=/ben/build/ --exclude=/ben/.ccache -arv /home/ben home-ben/

여기서 "ben"은 동기화중인 폴더입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.