我想将多个文件从远程服务器复制到本地计算机,使文件的总大小不超过一定限制,因为我本地没有足够的磁盘空间;并且这些文件是一个更大整体的可互换样本,即下载哪些单独的文件以及以什么顺序下载并不重要,只要在磁盘空间限制内下载许多这样的文件即可。
文件会正常下载,但一旦超出大小限制,下载就会停止,并且当前处理的文件将被丢弃。
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
)是开头的文件列表/数组。如果您可以通过其他方式生成文件列表,则可以免除依赖性。