累積サイズ制限があるリモートサーバーのSCP

累積サイズ制限があるリモートサーバーのSCP

ローカルに十分なディスク容量がなく、ファイルがより大きな全体の交換可能なサンプルであるため、ファイルの合計サイズが特定の制限を超えないように、リモートサーバーからローカルコンピュータに複数のファイルをコピーしたいと思います。つまり、どのファイルがダウンロードされるかは、ディスク領域の制限内で多くのファイルがダウンロードされる限り、個々のファイルがどの順序でダウンロードされるかは重要ではありません。

ファイルは正常にダウンロードされますが、サイズ制限を超えるとダウンロードが停止し、現在処理中のファイルが削除されます。

SCPにそのような能力がありますか? RSYNCがファイルサイズを制限できることは認識していますが、これは累積ファイルサイズではなく個々のファイルに対するものです。

SCPまたはRSYNCの両方がこれを実行できない場合は、他の方法はありますか?

ベストアンサー1

scpどちらもrsync特定の要件を満たしていません。しかし、完全なアプローチまで、標準ループが機能しているようです。

#!/bin/bash

# A set of candidate files to transfer. The construct here assumes
# straightforward filename (no spaces or other strangeness)
files=( $(ssh -n remoteHost 'echo *.dat') )

cd /dest/dir

maxSize=1024                                       # MB allowance
startUsed=$(df -m . | awk 'NR==2 {print $3+0}')    # MB used at start
st=                                                # Status stop reason

for file in "${files[@]}"
do
    # Enough disk space
    thisUsed=$(df -m . | awk 'NR==2 {print $3+0}')
    [ $(( thisUsed - startUsed )) -ge $maxSize ] && st=used && break

    # Copy the next selected file
    scp -p remoteHost:"$file" .        # scp (using sftp)
    # scp -Op remoteHost:"$file" .     # scp (using scp)
    # rsync -t remoteHost:"$file" .    # rsync

    [ $? -gt 0 ] && st=copy && break
done

# All done
case "$st" in
    used)    echo "INFO: Allowance reached" >&2 ;;
    copy)    echo "ERROR: Copy failed: $file" >&2 ;;
esac

唯一の依存関係bash(POSIXではないsh)は、最初のファイルのリスト/配列です。別の方法でファイルのリストを作成できる場合は、依存関係を免除できます。

おすすめ記事