SSH를 통해 파일을 안정적으로 이동(복사 아님)

SSH를 통해 파일을 안정적으로 이동(복사 아님)

SSH를 통해 많은 대용량 파일을 이동하고 싶습니다.

공간을 확보하고 싶어서 파일을 이동한 후 삭제하고 싶습니다. 데이터 양이 많기 때문에 언제든지 전송을 중단하고 나중에 동일한 명령을 사용하여 전송을 재개할 수 있으면 좋겠습니다. (실제로 하루에 한 번씩 인터넷 연결이 재설정되어 전송이 중단됩니다.)

불행히도 적어도 다음과 같이 rsync를 사용할 수는 없습니다.

rsync -avz --remove-source-files user@source:/path/ /destination_path/

rsync는 모든 파일을 복사한 후에만 소스 파일을 삭제합니다. 전송이 중단되면 여유 공간이 전혀 확보되지 않습니다. 명령을 cron에 넣으면 복사된 파일을 수동으로 삭제하지 않으면 명령이 완료되지 않습니다.

이 문제에 대한 해결책이 있습니까?

답변1

그래도 문제가 해결되지 않고 rsync각 파일을 성공적으로 복사한 후 소스 파일을 삭제하려는 경우 디렉터리별, 파일별 전송을 위해 다음을 수행할 수 있습니다.

if cd /path/to/files; then
for file in *; do
    if scp -pr "$file" [email protected]:/destination/files/"$file"; then
        rm -fr "$file"
    else
        echo "Transfer of '$file' failed.  Not removing local copy." 1>&2
    fi
done; fi

로컬 파일을 삭제하기 전에 추가 온전성 검사를 수행하려는 경우 일관성 검사를 추가할 수 있지만 이로 인해 대용량 파일의 속도가 느려지고 이 빠르고 더러운 체크섬은 디렉터리가 아닌 파일에서만 작동합니다.

if cd /path/to/files; then
for file in *; do
    if scp -pr "$file" [email protected]:/destination/files/"$file"; then
        if [[ "$(md5sum < "$file" )" = "$( ssh [email protected] md5sum < /destination/files/"$file" )" ]]; then
            rm -fr "$file"
        else
            echo "Unable to validate remote '$file'.  Not removing local copy" 1>&2
        fi
    else
        echo "Transfer of '$file' failed.  Not removing local copy." 1>&2
    fi
done; fi

답변2

rsync는 모든 파일을 복사한 후에만 소스 파일을 삭제합니다.

이것은 잘못된 전제입니다. 이는 대용량 파일이 몇 개만 있을 때 사실인 것처럼 보이지만 일반적인 경우에는 확실히 그렇지 않습니다.

rsync파일이 성공적으로 전송되면 명령은 삭제 명령을 대기열에 추가합니다. 그러나 명령이 다른 데이터와 다중화되므로 삭제가 소스에 적용되는 데 "시간"이 걸릴 수 있습니다.

많은 수의 파일을 실행하면 rsync모든 전송이 완료되기 전에 소스의 파일이 삭제되는 것을 볼 수 있습니다. (저는 rsync한 세션에서 수만, 심지어 수십만 개의 파일을 실행했는데 이런 동작을 확실히 본 적이 있습니다.)

또한 전송이 중단된 경우 rsync다시 시작하면 다음 파일 세트를 계속하기 전에 이전에 성공적으로 전송된 파일이 삭제됩니다. (나도 이런 행동을 본 적이 있다.)

고려하다https://superuser.com/a/405795/332907소스코드를 증거로 참고하세요.

관련 정보