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/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/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”은 동기화하는 폴더입니다.