来自具有累积大小限制的远程服务器的 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)是开头的文件列表/数组。如果您可以通过其他方式生成文件列表,则可以免除依赖性。

相关内容