삭제와 함께 기본 디렉토리와 특정 디렉토리의 파일을 백업하는 rsync 명령

삭제와 함께 기본 디렉토리와 특정 디렉토리의 파일을 백업하는 rsync 명령

다음 작업을 수행하는 rsync 명령을 준비하려고 합니다. 1. 중첩된 파일이 아닌 디렉터리의 모든 파일을 백업합니다. 2. 특정 디렉터리를 백업합니다. 3. 소스에서 파일이 삭제되면 대상 디렉터리의 파일을 삭제합니다.

rsync -vtr --delete --exclude='*/' --include='includes/*' --include='js/*' --include='css/*' /home/gameboy/abc/* /home/gameboy/PartialMirror/abc/

하지만 이는 파일만 복사할 뿐 폴더는 복사하지 않고 삭제도 하지 않습니다. 명령을 개선하는 데 도움을 주실 수 있나요?

답변1

엄밀히 말하면 다음은 모순된 목표로 해석될 수 있다.

  1. 디렉토리의 모든 파일을 백업하십시오.하지만 중첩된 파일은 아님즉 --exclude='*/'
  2. 특정 디렉터리 백업 - 즉 일부 중첩된 파일 포함

주장이 의도한 대로 작동하지 않은 이유에 대한 설명은 아래를 참조하세요. 아래에서 귀하의 목적에 맞는 적합한 대안을 확인하세요(#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/

관련 정보