일부 파일을 제외하는 rsync 옵션

일부 파일을 제외하는 rsync 옵션

rsync동일한 컴퓨터에 있는 두 개의 폴더를 동기화하는 데 사용합니다 .

파일은 다른 응용 프로그램의 소스 폴더에 기록됩니다. 우리가 가진 문제는 파일이 소스 폴더에 완전히 기록/복사되지 않은 경우에도 rsync가 파일을 대상에 복사한다는 것입니다.

확인/이체할 수 있는 방법/옵션이 있나요?오직소스 폴더의 전체 파일

답변1

그러한 개념이 존재하지 않기 때문에 부분 파일을 제외하는 것은 불가능합니다. 제작자가 파일을 생성하면 파일이 존재하지만 처음에는 비어 있다가 점차 채워집니다.

파일이 쓰기 위해 열려 있는지 테스트하면 파일이 불완전하다는 것을 알 수 있습니다. 그러나 이는 신뢰할 수 없습니다. 생산자가 충돌하면(프로세스가 충돌하거나 전체 시스템이 충돌하는 경우) 완전해 보이는 불완전한 파일이 생성됩니다.

당신이 해야 할 일은 생산자가 파일을 완료로 표시하기 위한 프로토콜을 정의하는 것입니다. 이를 수행하는 일반적인 방법(그리고 거의 유일하게 합리적인 방법)은 제작자가 임시 위치에 파일을 생성한 다음 rename작업이 완료되면 해당 파일을 해당 위치(시스템 호출 또는 셸 명령을 사용하여)로 옮기는 것입니다.mv

명명 규칙을 사용할 수 있습니다.

  • 생산자: 를 쓴 $FILENAME.tmp다음 최종 파일로 이동합니다.

    generate_data >"dir/$FILENAME.tmp"
    mv "dir/$FILENAME.tmp" "dir/$FILENAME"
    
  • 소비자: .tmp파일을 제외합니다.

    rsync -a --exclude='*.tmp' dir remote:
    

또는 준비 디렉터리를 사용할 수 있습니다.

  • 생산자: 준비 디렉터리에 쓴 다음 최종 위치로 이동합니다.

    generate_data >"dir/staging/$FILENAME"
    mv "dir/staging/$FILENAME" "dir/"
    
  • 소비자: 준비 디렉터리를 제외합니다.

    rsync -a --exclude='/staging' dir remote:
    

답변2

파일 크기가 고정된 경우(애플리케이션의 쓰기 작업 후) 크기만을 기준으로 파일을 전송할 수 있으므로 쓰기가 완료되지 않은 파일은 복사되지 않습니다.

--max-size=SIZE         don't transfer any file larger than SIZE
--min-size=SIZE         don't transfer any file smaller than SIZE

옵션이 rsync이를 제공합니다.

또는 전송을 시작할 때 애플리케이션이 파일에 쓰는지 여부를 사용하거나 확인할 fuser수 있습니다.lsof

if fuser /path/to/file.txt >/dev/null 2>&1; do
    rsync ....
else
    sleep 10
fi

답변3

지난 30분 동안 수정되지 않은 모든 파일을 찾기 위해 다음 명령어를 사용했습니다.

ssh sourceServer "find sourceDir -mmin +30 -type f | xargs -i -r rsync [ --remove-sent-files ] -aP {} destServer:destPath/"

관련 정보