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
rsync
선행으로 시작하는 전역 필터링 규칙 은 다음 /
과 같습니다.고정된전송의 루트에. 매뉴얼 페이지의 "패턴 규칙 포함/제외" 섹션을 인용하면 다음과 같습니다.
패턴이 /로 시작하면 파일 계층의 특정 위치에 고정되고, 그렇지 않으면 경로 이름의 끝과 일치합니다. 이는 정규 표현식의 앞에 있는 ^와 유사합니다. 따라서 "/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)
매뉴얼 페이지.
단순히 선행을 생략하는 것이 /
반드시 원하는 것은 아닙니다. 동일한 매뉴얼 페이지 섹션을 다시 인용하면 다음과 같습니다.
정규화되지 않은 "foo"는 알고리즘이 위에서 아래로 재귀적으로 적용되기 때문에 트리의 어느 위치에서든 "foo" 이름과 일치합니다. 마치 각 경로 구성 요소가 파일 이름의 끝인 것처럼 동작합니다. 고정되지 않은 "sub/foo"라도 "sub"라는 디렉터리에서 "foo"가 발견되는 계층 구조의 모든 지점과 일치합니다. 전송 루트에서 일치시킬 패턴을 지정하는 방법에 대한 자세한 내용은 "앵커 포함/제외 패턴" 섹션을 참조하세요.
따라서 필터 패턴은 build/
빌드 디렉터리의 어느 위치에서든 일치합니다 ./home/ben
/home/ben/many/sub/directories/build/
답변2
경고하다: 아래 @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
답변3
전체 /home 경로를 rsync하는 경우(즉, 후행 슬래시 없이) 제외 패턴이 작동합니다.
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
답변4
특정 폴더를 제외하려면 rsync
명령에서 상대 경로를 고려해야 합니다. 귀하의 경우:
rsync --exclude=/ben/build/ --exclude=/ben/.ccache -arv /home/ben home-ben/
여기서 "ben"은 동기화할 폴더입니다.