/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 스레드는 내 문제를 해결하지 못합니다.
- https://stackoverflow.com/questions/8270519/rsync-exclude-a-directory-but-include-a-subdirectory
- Rsync 포함 및 제외 옵션을 사용하여 디렉터리와 하위 디렉터리를 포함하지만 하위 디렉터리의 파일은 제외합니다.
여기서 무슨 문제가 있습니까?
[업데이트] 다음은 홈 디렉터리의 모양, 유지할 파일, 무시할 파일의 예입니다.
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 '*/'
위해 필요합니다 . 그렇지 않으면 최종 명령문에서 파일이 제외됩니다.rsync
Repos
pull_all.sh
--exclude
- 세 가지 용도가
*
구별됩니다.*
/
문자를 제외한 모든 것과 일치합니다 .**
/
문자를 포함하여 무엇이든 일치합니다.dir/***
dir/
및 를 지정하는 것과 동일한 단축키입니다dir/**
.
- 이
--prune-empty-dirs
플래그는rsync
빈 디렉토리 생성을 중지합니다. 이는 항목을Repos
찾기 위해 디렉토리 트리를 처리해야 하기 때문에 특히 중요합니다 .pull_all.sh
output
--dry-run
결과가 만족스러우면 삭제하세요.
답변2
원하는 하위 디렉터리에는 "+"를 사용하고 나머지 디렉터리에는 "-"를 사용할 수 있습니다.
rsync -auv "${src}" "${dst}" \
--filter=+_"/parent-dir/to-sync-child-dir/" \
--filter=-_"/parent-dir/*"