Last active
August 3, 2021 06:59
scp-delete-during-transfer.sh: for when you're running out of disk space and need to scp a file out while deleting chunks of it
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /usr/bin/env -S bash -e | |
SSH_USERHOST="user@host" | |
REMOTE_PATH="/tmp/disk_backup.img" | |
OUT_PATH="./$(basename ${REMOTE_PATH})" | |
TMP_PATH="/tmp/ssh-big-copy" | |
SLICES=200 | |
echo -e "\nGetting from ${SSH_USERHOST}: ${REMOTE_PATH}\n" | |
TOT_SZ=$(ssh ${SSH_USERHOST} "du -b ${REMOTE_PATH}" | egrep -o '^[0-9]+') | |
SLICE_SZ_M=$((TOT_SZ/SLICES/1024/1024+1)) | |
echo -e "Total size: ~$((TOT_SZ/1024/1024))M" | |
echo -e "Per slice: ~${SLICE_SZ_M}M (${SLICES} slices)" | |
mkdir "${TMP_PATH}" | |
for i in $(seq -w 1 ${SLICES} | sort -nr); do | |
echo -e "\nGetting slice with findex ${i} ...\n" | |
TO_SKIP_B=$((TOT_SZ-(SLICE_SZ_M*1024*1024))) | |
if [ ${TO_SKIP_B} -lt 0 ]; then TO_SKIP_B=0; fi | |
ssh "${SSH_USERHOST}" "dd if=\"${REMOTE_PATH}\" bs=1M iflag=skip_bytes skip=${TO_SKIP_B} count=${SLICE_SZ_M}" > "/tmp/ssh_out.tmp.${i}" | |
ssh "${SSH_USERHOST}" "truncate -s \"${TO_SKIP_B}\" \"${REMOTE_PATH}\"" | |
TOT_SZ=${TO_SKIP_B} | |
echo -e "Remaining size = ${TOT_SZ}\n" | |
done | |
echo -en "Writing ... " | |
cat /tmp/ssh_out.tmp.* > "${OUT_PATH}" | |
md5sum "${OUT_PATH}" | |
echo -e "\nCleaning up ..." | |
rm -r "${TMP_PATH}" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment