하나의 규칙 파일로만 rsync하고 일부 경로는 제외하고 선택된 하위 경로를 재귀 적으로 포함 제외하고 일부 하위

폴더의 모든 내용을 제외하고 일부 하위 폴더를 제외하고 싶 --exclude거나 --include명령 줄 옵션을 추가하지 않고 단일 규칙 파일로만 수행하고 싶습니다 . 이것이 가능한가? 유지 관리 및 문서화가 더 쉬우므로 단일 규칙 파일이 중요합니다.

다음 명령을 실행합니다

rsync -a -F --filter "merge backup-filter" /mnt/home/common /mnt/backup

파일로 backup-filter:

# non-rooted rules take precedence
+ .git/*
+ .gitignore
- .*.sw?

# rooted rules
+ /common/backup*
- /common/opt/
+ /common/usr/

# FIXME
+ /common/root/startup/*
+ /common/root/.config/gopt/*
- /common/root/*

그리고 두 개의 .rsync-filter파일

# cat ./usr/bin/.rsync-filter
# Assume command-line option --filter=':- .gitignore', which
# backs up all file/folders that aren't listed in ./.gitignore

# cat ./usr/.rsync-filter
+ usr/bin
- */

시작하는 규칙 블록 FIXME은 깨진 조각입니다. 모든 내용을 제외하는 것을 의미 /common/root하지만, 내용을하자 startup.config/gopt복사. 이 때문에 고장 startup.config/gopt복사되지 않습니다.

시간이 지남에 따라 다양한 수준에서 제외 경로를 더 추가하고 경로에 대해 여기에서 수행하는 것과 같은 일부 하위 경로를 추가 할 계획입니다 /common/root. 따라서 규칙 파일이 상당히 커질 것입니다.



답변

당신은 이것을 필요로합니다 :

+ /common/root/startup/
+ /common/root/startup/*
+ /common/root/.config/
+ /common/root/.config/gopt/
+ /common/root/.config/gopt/*
- /common/root/.config/*
- /common/root/*

또는 나중에 파일 별 규칙을 무시하지 않으려는 경우 다음과 같이하십시오.

+ /common/root/startup/
+ /common/root/.config/
+ /common/root/.config/gopt/
- /common/root/.config/*
- /common/root/*

문제는 결코 되풀이되지 않았 startup거나 지시하지 .config않았기 때문 - /common/root/*입니다.

이 버전은 당신이 있음을 명시 적으로 말한다 않는 해당 디렉토리를 원한다. 이와 같은 하위 디렉토리를 선택하려면 모든 상위 디렉토리 레벨에 대해이 작업을 수행해야합니다.

또 다른 트릭을 포함하는 모든 디렉토리+ */상단을하고 제외 파일 당신이 원하지 않는를 - /common/root/**. 그런 다음 빈 디렉토리의 혼란을 정리할 수 --prune-empty-dirs있지만 이로 인해 실제 빈 디렉토리뿐만 아니라 내용을 제외하기로 선택한 디렉토리도 제거됩니다.


답변