로컬에 디스크 공간이 충분하지 않고 파일이 더 큰 전체의 상호 교환 가능한 샘플이기 때문에 파일의 총 크기가 특정 제한을 초과하지 않도록 원격 서버에서 로컬 컴퓨터로 여러 파일을 복사하고 싶습니다. 즉, 어떤 파일이 다운로드되는지는 디스크 공간 제한 내에서 많은 파일이 다운로드되는 한 개별 파일이 어떤 순서로 다운로드되는지는 중요하지 않습니다.
파일은 정상적으로 다운로드되지만, 크기 제한을 초과하면 다운로드가 중지되고 현재 처리 중인 파일이 삭제됩니다.
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
)은 시작 부분의 파일 목록/배열입니다. 다른 방법으로 파일 목록을 생성할 수 있으면 종속성을 면제할 수 있습니다.