ローカルに十分なディスク容量がなく、ファイルがより大きな全体の交換可能なサンプルであるため、ファイルの合計サイズが特定の制限を超えないように、リモートサーバーからローカルコンピュータに複数のファイルをコピーしたいと思います。つまり、どのファイルがダウンロードされるかは、ディスク領域の制限内で多くのファイルがダウンロードされる限り、個々のファイルがどの順序でダウンロードされるかは重要ではありません。
ファイルは正常にダウンロードされますが、サイズ制限を超えるとダウンロードが停止し、現在処理中のファイルが削除されます。
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
)は、最初のファイルのリスト/配列です。別の方法でファイルのリストを作成できる場合は、依存関係を免除できます。