또한번 rsync : –backup –delete 사용 시 주의할 점, –filter, protect 사용법.

--delete 는 이전에 정리한 적이 있다. 원본에 있는 파일이 지워지면 복사본에서도 지우라는 명령이 된다.
헌데, 바로 지워지면 조금 애매할 때도 있다.
이럴 때, 복사본에선 바로 그 파일을 지우는게 아니라, 지워졌음을 표시해주게끔 할 수가 있다. 사실, 지워졌음을 표시한다기 보다는 파일명을 바꿔서 백업본임을 알 수 있게 한다. (어떻게 이름을 바꿀 지도 정해줄 수 있는데, 기본값은 ~ 이다. 즉, 원본에 있던 가나다라.txt 가 지워졌다면, 사본에선 가나다라.txt~ 가 된다.

이럴 때 쓰는 명령이 –backup 이다.


그런데, 여기에 좀 모순(?)이 있다.

rsync --backup --delete /src /dest

이런 명령(첫번째)을 내렸고, /src/가나다라.txt/dest/가나다라.txt 로 복사되었다.
그런데, 이 파일이 필요없게 되어 지웠고, 다시 저 명령(두번째)을 내렸다.

그 결과, /src/가나다라.txt 는 없어졌고, /dest/가나다라.txt~ 가 생겨났다.
여기까지는 의도한 대로다.

이 상태에서 한번 더 rsync 를 수행(세번째)하면?
/dest/가나다라.txt~ 는 지워져버린다. 이래서야 굳이 애써 –backup 을 할 이유가 없지 않은가.


여기에서 –filter, 그중에서도 protect 가 등장한다.
–filter 는 파일을 추가(include) 하고 배제(exclude)하기도 하지만, protect 로 명시하여 저런 경우 삭제가 되지 않도록 보호해 줄 수 있다.

이 내용은 rsync man page 에서 ‘FILTER RULES’ 쪽에 자세히 나와있다. (문제는 봐도 잘 이해가 안되니..)
그리고, 이 필터룰은 –include, –exclude, –inculde-from, –exclude-from 등등에는 넣어선 안된다. 반드시 –filter 에 넣어야 하고, 파일로도 만들어 넣을 수 있다. 이게 바로 --filter merge /some/foo/bar.txt 이다.

아무튼, 이렇게 지워지지 않기를 바라는 파일을 선택해서 필터에 추가한다.
예를 들어 다음과 같이 필터 파일을 만들었다면..

P *~
- 다운로드/*/
- 다운로드/.*
+ 다운로드/
+ 다운로드/*
+ 공부/***
+ 문서/***
+ 비디오/***
+ 사진/***
+ 음악/***
+ 읽을거리/***
+ 작업대/***
- *

따지고 보면 간단한 논리인데, 모르면 어떻게 진행되는지 상당히 헷갈린다.

  • 먼저 P *~ 는 ~ 로 끝나는 모든 파일을 Protect, 즉 –delete 명령이 있더라도 삭제하지 말라는 뜻이다.
  • – 다운로드/*/ 는 다운로드 밑의 모든 서브디렉토리를 배제하라는 명령이고,
  • + 다운로드/ 는 다운로드 디렉토리 자체는 추가하라는 뜻이다. 이게 없으면 rsync 는 다운로드 디렉토리를 아예 방문하지 않는다.

** 여기서 잠깐. 사실 논리흐름대로라면, + 다운로드/ 를 먼저해줘야 맞긴 할 듯 한데, 저렇게 해도 문제는 없었다.
왜 + 다운로드/ 를 먼저하는게 맞다고 생각하냐하면, – 다운로드/*/ 나 – 다운로드/.* 는, 일단은 다운로드 디렉토리 자체로 접근 허가가 있어야 진행이 되기 때문이다. 따라서, 애초에 규칙 순서에서 + 다운로드/ 를 먼저 주는게 옳다고 보인다.
그러나 저러나, 아무튼 저렇게 해도 진행은 됐다.

나머지도 간단히 설명하자면,

  • + 다운로드/* 는 다운로드 디렉토리 밑의 모든 파일들을 /(슬래시)가 나오기 전까지 선택하라는 의미가 된다. 이 명령 자체만으로는 산하 첫번째 디렉토리도 선택이 된다. (허나 위에서 이미 디렉토리를 배제했으므로 선택되진 않는다.)
  • + 공부/*** 등등은 해당 디렉토리 이하 하위디렉토리까지 모두 선택하라는 의미고
  • – * 는 추가하지 않은 모든 디렉토리/파일은 배제하라는 뜻이다.

장황하게, 지금까지 알고 있는 내용을 모두 한 곳에 정리했지만, 이 글의 핵심은 Protect 에 있다. 지워짐을 방지하는 필터/명령.

Author: 아무도안

안녕하세요. 글 남겨주셔서 고맙습니다.