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

おすすめ記事