SSHを介してファイルを確実に移動する(コピーではありません)

SSHを介してファイルを確実に移動する(コピーではありません)

SSHを介して多くの大容量ファイルを移動したいと思います。

スペースを確保したいので、ファイルを移動した後に削除したいと思います。データ量が多いので、いつでも転送を中断し、後で同じコマンドを使用して転送を再開できれば幸いです。 (実際には1日1回インターネット接続がリセットされ、転送が中断されます。)

残念ながら、少なくとも次のように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すべての転送が完了する前にソースのファイルが削除されることがわかります。 (私はrsync1つのセッションで数万、数十万のファイルを実行しましたが、この動作をはっきり見たことがあります。)

また、転送が中断された場合にrsync再起動すると、次のファイルセットを続行する前に以前に正常に転送されたファイルが削除されます。 (私もこのような行動を見たことがある。)

考えるhttps://superuser.com/a/405795/332907ソースコードを証拠として参照してください。

関連情報