rsync 제외 디렉터리가 작동하지 않음

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에 의해 복사되고 있습니다. 내가 뭘 잘못하고 있니?

댓글

  • 제외 패턴은 작동하지 않는다고 생각합니다. '

답변

전역 rsync 선행 /로 시작하는 필터 규칙은 다음의 루트에 고정 됩니다. 맨 페이지의 “INCLUDE / EXCLUDE PATTERN RULES”섹션에서 인용 :

패턴이 /로 시작하면 패턴이 파일 계층 구조의 특정 지점, 그렇지 않으면 경로 이름의 끝과 일치합니다. 이것은 정규 표현식의 선행 ^와 유사합니다. 따라서 “/ foo”는 “루트의 루트”에서 “foo”의 이름과 일치합니다. transfer “(글로벌 규칙의 경우) 또는 merge-file”의 디렉토리 ( 디렉터리 별 규칙).

명령 (rsync ... -arv /home/ben home-ben/)에서 /home/ben/foohome-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/many/sub/directories/build/.

댓글

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

답변

경고 : 아래 @ rubo77의 댓글 당 ,이 답변은 “루트뿐만 아니라 소스 트리의 모든 곳에서 이러한 항목을 제외하려는 경우에만 사용해야합니다. 더 자세한 설명은 위의 @ jw013 “의 답변을 참조하십시오.

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 

댓글

  • 이 답변은 잘못되었습니다. 상대 제외 경로를 사용하면 모든 패턴이 제외됩니다!
  • 이 게시물은 정확합니다. 일치는 파일 inode 기반이 아니라 텍스트 기반입니다. --verbose 명령의 출력 경로가 무엇이든 사용해야하는 형식입니다.
  • 이것은 저에게 효과적이었습니다.
  • 소스 경로는 ' / '이고 절대 경로는 상대 경로이지만 여전히 그렇지 않습니다. ' t 작동합니다.
  • 이것이 저에게 유일한 효과였습니다.

답변

전체 / home 경로를 rsync하면 제외 패턴이 작동합니다.후행 슬래시 제외 :

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

그러나 후행 슬래시가있는 폴더의 콘텐츠 만 rsync하는 것이 좋습니다.

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

답변

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

설명

  • 쉘 인터프리터의 쉘 선택이이 특정 문제를 어떻게 유발합니까?

Answer

rsync로 특정 폴더를 제외하려면 명령의 상대 경로를 고려해야합니다. 이 경우 :

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

여기서 “ben”은 동기화하는 폴더입니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다