하위 디렉터리의 파일 목록을 원격 서버에 rsync하고 관련 없는 파일 삭제

하위 디렉터리의 파일 목록을 원격 서버에 rsync하고 관련 없는 파일 삭제

나는 이 질문에 대한 답을 찾지 못했습니다. --include, --exclude, -r--delete-excluded소스 디렉터리 의 다양한 조합을 시도했습니다 .

이것이 내가 달성하고 싶은 것입니다:

  • 소스 코드 디렉토리:

    Dir1/File1-1
    Dir1/File1-2
    Dir2/File2-1
    Dir2/File2-2
    Dir2/File2-3
    Dir3/File3-1
    Dir3/File3-2
    Dir3/File3-3
    ...
    
  • 대상 디렉터리: (
    상태 알 수 없음)

내가 원하는 것은 소스 디렉터리에 미리 정의된 파일 하위 집합과 상대 경로를 제공하고 이를 원격 대상과 동기화하여 대상에서 파일 하위 집합(디렉터리 포함)이 아닌 모든 항목을 제거하는 것입니다.

예를 들어, 위의 소스 디렉터리는 다음과 같습니다.

  • 내 사전 정의된 파일 목록:

    Dir1/File1-2
    Dir3/File3-3
    
  • 대상 디렉터리:

    Dir1/File1-1
    Dir1/File1-2
    Dir2/File2-1
    Dir3/File3-1
    

완료되면 대상에 Dir1/File1-2, Dir3/File3-3만 포함하고 Dir2는 포함하지 않습니다. 또한 Dir1/File1-2가 다시 복사되는 것을 원하지 않습니다.

지침:

  • 이것은 매우 큰 파일이므로 필요하지 않을 때 원격으로 다시 복사되는 것을 방지하려고 노력하고 있습니다.
  • 소스 하위 디렉터리의 내용은 매일 변경됩니다.
  • 사전 정의된 목록은 매일 변경되지만 어제 목록의 파일이 포함될 수도 있습니다.
  • 소스 디렉터리에 0개의 파일이 있습니다. 동기화에 필요한 파일이 포함된 하위 디렉터리만 포함됩니다.
  • 소스 코드 내의 하위 디렉터리는 상당히 정적입니다. 즉, Dir1, Dir2 및 Dir3은 항상 존재합니다.

나는 내가 찾고 있는 해결책을 찾을 수 있는지 계속해서 노력할 것입니다.

고쳐 쓰다:

우선 감사드리고 싶습니다jw013형식 변경을 위해. 도움말 가이드를 따랐지만 형식이 잘못된 이유를 이해할 수 없습니다(처음 포스터).

다음 추천을 사용하세요.서지, 다음 명령을 생각해 냈지만 여전히 파일 목록에 없는 대상에서 불필요한 파일을 제거하지 못했습니다.

  • 주문하다

    rsync -avRP --prune-empty-dirs --delete-delay --ignore-existing $FILE_LIST destination/
    

답변1

다음을 사용하여 이 작업을 수행할 수 있습니다.

rsync -av --delete --update --include-from=LISTFILE   -f 'hide,! */' src/ dst

그 중에는 LISTFILE대상 디렉터리에 동기화되어야 하는 모든 파일이 포함된 파일이 있습니다. 파일이 변경되지 않은 경우 --ignore-existing를 사용하여 읽을 수 있습니다 --update.rsync 매뉴얼 페이지더 알아보기.

답변2

파일이 소스에 없으면 rsync와 함께 다양한 삭제 옵션을 사용하여 대상에서 파일을 삭제할 수 있습니다.

        --del                   an alias for --delete-during
        --delete                delete extraneous files from dest dirs
        --delete-before         receiver deletes before xfer, not during
        --delete-during         receiver deletes during the transfer
        --delete-delay          find deletions during, delete after
        --delete-after          receiver deletes after transfer, not during

또한 다음을 --ignore-existing사용하여 대상에 있는 파일 복사를 건너뛸 수 있습니다.

        --ignore-existing       skip updating files that exist on receiver

빈 디렉토리를 제거하려면 다음을 사용해야 합니다.

    -m, --prune-empty-dirs      prune empty directory chains from file-list

그래서 명령은

rsync -av --prune-empty-dirs --delete-delay --ignore-existing src/ dst

나는 당신이 찾고 있는 것을 할 것이라고 생각합니다

답변3

나는 당신이 주의를 기울일 필요가 있다고 생각합니다 --delete-excluded. 로컬에서 시도해 보았는데 필요에 따라 작동하는 것 같습니다. 내가 먼저 노력할게

rsync -a --delete-excluded --include-from=LISTFILE --exclude="*" src/ dst

왜 특정 다른 옵션이 제안되는지 잘 모르겠습니다. P. 가장 "흥미로운" 것은 입니다 --ignore-existing. 보다 친숙한 최적화를 먼저 이해하는 것이 -a좋습니다 -u.

이미 이것을 사용하고 있는 것 같습니다 -a. 즉 -t, 기본적으로 rsync를 최적화할 수 있다는 뜻입니다. "Rsync는 기본적으로 크기나 마지막 수정 시간이 변경된 파일을 찾는 "빠른 확인" 알고리즘을 사용하여 전송해야 하는 파일을 찾습니다." 그렇지 않은 경우 일반적으로 " 또는 - 수신기에서 최신 파일 건너뛰기"를 -a사용할 수 있습니다 .-u--update

"빠른 확인" 최적화로 차이를 측정하고 싶은 경우장애가 있는, 당신은 그것을 사용할 수 있습니다 --checksum. (손상된 경우 특정 시점에 모든 기존 파일을 강제로 재동기화하려는 경우에도 유용합니다. -v활성화하면 어떤 파일을 다시 작성해야 하는지 확인할 수 있습니다.)

관련 정보