rsync: 필터를 사용하여 최상위 디렉터리를 제외하지만 일부 하위 디렉터리는 포함합니다.

rsync: 필터를 사용하여 최상위 디렉터리를 제외하지만 일부 하위 디렉터리는 포함합니다.

/home내 디렉토리를 백업하고 싶습니다동기화. 나는 rsync에 대해 읽었습니다.매뉴얼 페이지이 작업을 수행하기 위해 필터링 규칙을 사용하기로 결정했습니다.

내가 달성하고 싶은 것: 디렉터리의 모든 파일과 디렉터리를 제외 Repos하지만 모든 pull_all.sh파일과 디렉터리는 output디렉터리에 유지합니다.Repos--- 디렉토리 어디에 있든 상관없습니다 .

지금까지 다음과 같은 필터 목록을 얻었지만 이는 디렉터리 pull_all.sh가 아닌 파일 만 백업합니다 output.

# Files prefixed with "+ " are included. Files prefixed with "- " are excluded.
#
# The order of included and excluded files matters! For instance, if a folder
# is excluded first, no subdirectory can be included anymore. Therefore,
# mention included files first. Then, mention excluded files.
#
# See section "FILTER RULES" of rsync manual for more details.


# Included Files

# TODO: This rules do not work properly!
+ output/***
+ pull_all.sh
- Repos/**

# Excluded Files

- .android
- .cache
...

내 스크립트에서 필터 목록을 사용하고 있습니다 run_rsync.sh.

#!/bin/bash

date="$(date +%Y-%m-%d)"
hostname="$(hostname)"

# debug_mode="" # to disable debug mode
debug_mode="--list-only"

# Note: With trailing "/" at source directory, source directory is not created at destination.
rsync ${debug_mode} --archive --delete --human-readable --filter="merge ${hostname}.rsync.filters" --log-file=logfiles/$date-$hostname-home.log --verbose /home backup/

불행히도 기존 StackExchange 스레드는 내 문제를 해결하지 못합니다.

여기서 무슨 문제가 있습니까?

[업데이트] 다음은 홈 디렉터리의 모양, 유지할 파일, 무시할 파일의 예입니다.

user@hostname:~$ tree /home/ | head
/home/
└── user
    ├── Desktop                -> keep this
    │   ├── file1              -> keep this
    │   └── file2              -> keep this
    ├── Documents              -> keep this
    ├── Repos
    │   ├── pull_all.sh        -> keep this
        ├── subdir1
        │   ├── output         -> keep this
        ├── subdir2
            ├── another_subdir
                ├── output     -> keep this
        ├── subdir3            -> do not keep (because does not contain any "output")
        ├── file3              -> do not keep

답변1

귀하의 요청에 대한 저의 설명을 조금 더 반복하자면,

  • pull_all.sh어디서 찾든 모든 파일을 포함합니다 .
  • output모든 디렉토리를 포함그리고 그 내용우리가 그들을 찾을 때마다
  • Repos이미 명시한 디렉토리 이외의 디렉토리는 제외하세요 .
  • 다른 모든 것을 포함하여

이는 다음과 같이 지정할 수 있습니다.

rsync --dry-run --prune-empty-dirs -av

    --include 'pull_all.sh'
    --include 'Repos/**/output/***'

    --include '*/'

    --exclude 'Repos/***'

    /home backup/

몇 가지 메모

  • 이는 디렉터리 트리 아래로 내려가(파일을 찾기 위해) 고려하기 --include '*/'위해 필요합니다 . 그렇지 않으면 최종 명령문에서 파일이 제외됩니다.rsyncRepospull_all.sh--exclude
  • 세 가지 용도가 *구별됩니다.
    • */문자를 제외한 모든 것과 일치합니다 .
    • **/문자를 포함하여 무엇이든 일치합니다.
    • dir/***dir/및 를 지정하는 것과 동일한 단축키입니다 dir/**.
  • --prune-empty-dirs플래그는 rsync빈 디렉토리 생성을 중지합니다. 이는 항목을 Repos찾기 위해 디렉토리 트리를 처리해야 하기 때문에 특히 중요합니다 .pull_all.shoutput
  • --dry-run결과가 만족스러우면 삭제하세요.

답변2

원하는 하위 디렉터리에는 "+"를 사용하고 나머지 디렉터리에는 "-"를 사용할 수 있습니다.

rsync -auv "${src}" "${dst}" \
--filter=+_"/parent-dir/to-sync-child-dir/" \
--filter=-_"/parent-dir/*"

관련 정보