다음 작업을 수행하는 rsync 명령을 준비하려고 합니다. 1. 디렉터리의 모든 파일 백업(중첩 파일 제외) 2. 일부 디렉터리 백업 3. 소스 디렉터리의 파일이 삭제되면 대상 디렉터리의 파일도 삭제
rsync -vtr --delete --exclude='*/' --include='includes/*' --include='js/*' --include='css/*' /home/gameboy/abc/* /home/gameboy/PartialMirror/abc/
하지만 이렇게 하면 폴더는 복사되지 않고 파일만 복사되거나 삭제됩니다. 명령을 개선하는 데 도움을 주실 수 있나요?
답변1
엄밀히 말하면 다음은 모순된 목표로 해석될 수 있다.
- 디렉터리의 모든 파일을 백업합니다.하지만 중첩된 파일은 아님즉, 제외='*/'
- 특정 디렉터리 백업(예: 일부 중첩된 파일 포함)
주장이 예상대로 작동하지 않는 이유는 아래 설명을 참조하세요. 아래에서 귀하의 목적에 맞는 적절한 대안(#1, #3, #2를 만족하는 버전)을 확인하세요.
명령이 작동하지 않는 이유:
rsync가 명령줄 매개변수를 처리하는 방식에서 다음 매개변수는 --exclude='*/'라고 말하는 것과 같습니다.
--제외='/'--include='필수 하위 폴더/'
즉, 명령은 중첩된 모든 파일과 필수 하위 폴더의 파일을 제외합니다.
이 문제는 소스에서 삭제된 대상의 파일이 삭제되지 않는다는 두 번째 관찰에 영향을 미칩니다. 실제로, 귀하의 명령은 그러한 파일의 최상위 수준을 삭제하는 데 매우 효과적입니다. 단, 다음 레벨의 파일은 제외되었기 때문에 삭제되지 않습니다. --delete는 --delete-before가 아니라 --delete-during을 나타냅니다.
버전 #1, #3, #2를 만족하는 솔루션: 다음 솔루션이 귀하의 요구에 적합할 수 있습니다.
rsync -avz --delete --include='includes/*' --include='js/*' --include='css/*' --exclude='*/*' /home/gameboy/abc/ /home/gameboy/PartialMirror/abc/
다음 조건을 충족합니다. 1. 깊이 1의 모든 파일과 디렉터리를 백업하지만 중첩된 파일은 백업하지 않습니다. 2. 필요한 폴더를 백업합니다. 3. 원본에 없는 파일을 대상에서 삭제합니다.
또 다른 더 귀찮은 옵션은 다음과 같습니다
rsync -vlptgoDd --delete src/ dest/
이는 #1과 #3을 만족하지만 모든 중첩 파일을 방지합니다(폴더는 *nix의 파일이기도 함을 기억하세요). 재귀적이지 않도록 -r 옵션을 제공하지 않았습니다. 항목을 삭제하고 깊이가 1인 폴더를 복사합니다. 타임스탬프(-t) 보존 외에도 아카이브 복제를 위한 다른 일반적인 옵션을 포함했습니다.
다양한 폴더에서 다양한 rsync 동작을 얻는 보다 표준적인 방법은 계층 구조를 통해 디렉터리별로 필터링 규칙을 확산하는 것입니다. 즉, 고유한 동작이 필요한 각 폴더에 특정한 .rsync-filter 파일을 생성하는 것입니다. 예를 들어
rsync -avF src/ dest/