rsync : –include-from(exclude-from) 사용법과 덤으로 out-format 까지.

tar 에도 비슷한 용법이 있는데, rsync 에도 선택(또는 배제)할 파일목록을 외부 파일로 만들고, 그걸 참고하여 작업을 진행하는 기능이 있다.

헌데 이게.. 확실하진 않은데 include-from 이나 exclude-from 뭘 써도 결과는 같은 듯도 한데..
이번 꽃삽질을 하면서도 정확하게는 알 지 못했다. 그게 좀 아쉽네. 설명서를 다시 열심히 보고는 있지만, 그래도 잘 모르겠다. (include from 에 대해선 추가 연구가 있었다. 그 글 내용이 굉장히 중요하므로 꼭 읽어보도록! 그렇지 않으면 엉뚱한 결과가 나올 수도 있다.)

일단, 목록 파일은 이런 형식어야만 한다.

- cam-20210515-0001.mp4
- cam-20210515-0003.mp4
- cam-20210515-0005.mp4
- cam-20210515-0007.mp4
- cam-20210515-0009.mp4
- cam-20210515-0011.mp4
- cam-20210515-0013.mp4
- cam-20210515-0015.mp4
- cam-20210515-0017.mp4
- cam-20210515-0019.mp4
- cam-20210515-0021.mp4
- cam-20210515-0023.mp4
- cam-20210515-0025.mp4
- cam-20210515-0027.mp4
- cam-20210515-0029.mp4
- cam-20210515-0031.mp4
- cam-20210515-0033.mp4
- cam-20210515-0035.mp4
- cam-20210515-0037.mp4
- cam-20210515-0039.mp4
- cam-20210515-2211.mp4

맨 앞에 - 표시가 붙어서, 이 파일은 ‘배제하라’는 뜻이 된다.
반대로, 선택/추가해줄 때는 + 를 넣어준다.

--exclude-from 을 쓰고, 저 목록파일을 연결해주면 저 파일들은 모두 작업에서 빠지게 된다.
헌데, 똑같은 파일을 –include-from 에 넣어주면 어찌 되려나??

실험결과, 둘은 같다. (다시 말해, include-from 에 – 를 넣어도 되고, exclude-from 에 + 를 넣어도 된다.)
모두 이런 결과를 볼 수 있었다.

[sender] hiding file 2021/05/17/cam-20210517-0013.mp4 because of pattern cam-20210517-0013.mp4
[sender] hiding file 2021/05/17/cam-20210517-0015.mp4 because of pattern cam-20210517-0015.mp4
[sender] hiding file 2021/05/17/cam-20210517-0017.mp4 because of pattern cam-20210517-0017.mp4
[sender] hiding file 2021/05/17/cam-20210517-0019.mp4 because of pattern cam-20210517-0019.mp4
[sender] hiding file 2021/05/17/cam-20210517-0021.mp4 because of pattern cam-20210517-0021.mp4
[sender] hiding file 2021/05/17/cam-20210517-0023.mp4 because of pattern cam-20210517-0023.mp4
[sender] hiding file 2021/05/17/cam-20210517-0025.mp4 because of pattern cam-20210517-0025.mp4
[sender] hiding file 2021/05/17/cam-20210517-0027.mp4 because of pattern cam-20210517-0027.mp4

따라서, include/exclude-from, 뭐를 써도 된다.
저 선택사항 이름으로 작업이 결정되는게 아니고, 목록파일에 설정된 패턴에 의해서 결정이 된다는 사실을 ‘반드시’ 기억해야만 한다.
패턴 사용법은, rsync man page 에서 ‘INCLUDE/EXCLUDE PATTERN RULES’ 항목에서 살펴볼 수 있다.

사용은?

이런 식으로.

cat <<< "$EXCL_FILES" | \
sudo --user=#1000 rsync -avvu \
        --no-p --no-g \
        --chmod=ugo=rwX \
        --out-format="%f%L %t" \
        --exclude-from=- \
        --list-only \
        "$LOCAL_DIR/" "$NFS_CCTV_DIR" \
        | tee /tmp/backup-to-nfs-"$INIT_TIME".log

cat <<< "$EXCL_FILES" 을 Pipeline 하여 rsync 의 --exclude-from=- 의 stdin 으로 보낸다. 이에 관한 길고도 지루한 설명(?)은 다른 글에 이미 써놓았다.

exclude-from 에 Process Substitution, 즉 <(command) 도 써봤는데, sudo 로 저 명령을 실행했을 때는 제대로 작동하질 않았다.
여러모로, Pipeline 과 stdin 을 사용하는게 좋은 방법이라 생각한다.

두번째로, --out-format

이 선택사항은, update 시 화면에 표시되는 내용을 ‘어떤 형식으로 할까’를 사용자가 결정할 수 있게 해준다. 따라서 조금 더 자세한 정보를 얻을 수 있다. --out-format=FORMAT 으로 모양새를 갖춰야 하는데, 이때 사용할 FORMATrsyncd.conf man page 를 참고하라고 한다.

“For a full list of the possible escape characters, see the “log format” setting in the rsyncd.conf manpage.”

시키는 대로 여기(거기?)를 참고해서 --out-format="%f%L %t" 으로 설정했다.

  • %f the filename (long form on sender; no trailing “/”)
  • %L the string ” -> SYMLINK”, ” => HARDLINK”, or “” (where SYMLINK or HARDLINK is a filename)
  • %t the current date time

나한텐 %L 은 별로 필요하진 않았지만.
이 결과를 살펴보면 대충 이렇다.

2021/05/16/cam-20210516-2219.mp4 is uptodate
2021/05/16/cam-20210516-2221.mp4 is uptodate
2021/05/16/cam-20210516-2223.mp4 is uptodate
2021/05/16/cam-20210516-2225.mp4 is uptodate
2021/05/16/cam-20210516-2227.mp4 is uptodate
cam-rec/2021/05 2021/05/17 00:13:12
cam-rec/2021/05/16 2021/05/17 00:13:12
cam-rec/2021/05/16/cam-20210516-2229.mp4 2021/05/17 00:13:12
cam-rec/2021/05/16/cam-20210516-2231.mp4 2021/05/17 00:13:14
cam-rec/2021/05/16/cam-20210516-2233.mp4 2021/05/17 00:13:16
cam-rec/2021/05/16/cam-20210516-2235.mp4 2021/05/17 00:13:18

rsync -u 를 줬으므로, src 와 dest 에 있는 파일이 동일할 경우, 덮어쓰지 않고 그냥 넘긴다. 그게 바로 ‘uptodate’ 다.
그 아래, 위에서 설정한 ‘%f%L %t’ 대로, 파일명과 시간이 나와있다.
다른 정보가 필요하면, man page 를 참고해서 더 넣어주면 되겠다.

Author: 아무도안

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