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
으로 모양새를 갖춰야 하는데, 이때 사용할 FORMAT 은 rsyncd.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 를 참고해서 더 넣어주면 되겠다.