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. 디렉터리의 모든 파일을 백업합니다.하지만 중첩된 파일은 아님즉, 제외='*/'
  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/

관련 정보