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소스코드를 증거로 참고하세요.