
다음 작업을 수행하는 rsync 명령을 준비하려고 합니다. 1. 중첩된 파일이 아닌 디렉터리의 모든 파일을 백업합니다. 2. 특정 디렉터리를 백업합니다. 3. 소스에서 파일이 삭제되면 대상 디렉터리의 파일을 삭제합니다.
rsync -vtr --delete --exclude='*/' --include='includes/*' --include='js/*' --include='css/*' /home/gameboy/abc/* /home/gameboy/PartialMirror/abc/
하지만 이는 파일만 복사할 뿐 폴더는 복사하지 않고 삭제도 하지 않습니다. 명령을 개선하는 데 도움을 주실 수 있나요?
답변1
엄밀히 말하면 다음은 모순된 목표로 해석될 수 있다.
- 디렉토리의 모든 파일을 백업하십시오.하지만 중첩된 파일은 아님즉 --exclude='*/'
- 특정 디렉터리 백업 - 즉 일부 중첩된 파일 포함
주장이 의도한 대로 작동하지 않은 이유에 대한 설명은 아래를 참조하세요. 아래에서 귀하의 목적에 맞는 적합한 대안을 확인하세요(#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/