태그 보관물: 싱크

rsync – ‘cannot delete non-empty directory’ errors

로컬에 있는 파일과 모델, 데이터 등을 리모트의 어딘가로 싱크하는 것은 데이터사이언스 작업을 하면서 빈번하게 있는 일입니다. 복잡한 파이프라인을 작성할 것은 아니기 때문에 간단하게 rsync를 사용할 때가 많습니다.

제가 주로 사용하는 옵션은 이렇습니다.

rsync -avzrub --delete /tmp/source /tmp/target

그런데 이 옵션을 실행하다 보면 다음과 같은 에러가 나올 때가 있습니다.

rsync 'cannot delete non-empty directory' errors

–delete 옵션은 소스에 없는 것들은 타겟에서도 지우라는 명령입니다. 이때 소스에 없는 파일과 디렉토리는 타겟에서도 지워야 하는데 디렉토리를 지우지 못하는 것입니다.

원인은 -b 옵션 때문인데 -b 옵션은 타겟에서 파일을 지욱 때 만약을 대비하기 위해 파일을 ~가 끝에 붙은 이름으로 변경해서 백업하는 기능입니다. 이 옵션으로 인해 지우지 못하게 됩니다.

-b 옵션을 제거하면 문제가 해결됩니다.

만약 그래도 백업을 해야 하고 특정 디렉토리는 다르게 관리해야 한다면 –exclude 옵션으로 그 디렉토리를 제외하고 그 디렉토리는 다른 옵션으로 rsync를 수행해야 합니다.

rsync 소스 디렉토리에 없는 파일을 목표 디렉토리에서 삭제하기

데이터를 처리하는 중에 moving windows와 같은 방식으로 데이터 파일을 관리하고 원격 서버에서 데이터를 보내거나 가져오는 일을 하는 경우가 많습니다. 여러가지 방법으로 이 작업을 할 수 있지만 가장 쉽고 편한 방법은 rsync를 사용하는 것입니다.

rsync의 기본 옵션은 소스 디렉토리에 파일이 없고 목표 디렉토리에 있는 경우에 목표 디렉토리의 파일을 삭제하지 않습니다. 안전을 위해서 기본값으로 설정하지 않은 것인데요.

하지만 여러가지 목적으로 소스 디렉토리에 파일이 삭제되면 목표 디렉토리에서 삭제해버리고 싶을때가 있습니다.

다음과 같이 –delete 옵션을 사용하면 됩니다.

rsync -avzrub --delete /data/source_files user01@server01.euriion.com:/data/dest_files/

하지만 다음과 같이 rsync를 사용할 때 소스 디렉토리에 파일을 지정하게 되면 작동하지 않으므로 주의해야 합니다.

rsync -avzrub --delete /data/source_files/* user01@server01.euriion.com:/data/dest_files/