Home > bash, linux, n800, ssh, T60 > Howto : Resume a failed copy command where it left off

Howto : Resume a failed copy command where it left off

Currently, file copying utilities such as cp, scp, rsync etc. are not able to resume where they left off after a failed copy operation. In this article, a solution is provided using the utility dd to pick up where cp left off. Read on for more.


Installation
To install recp, type the following commands in a terminal

wget http://www.hartvig.de/files/recp
mv recp ~/bin/
chmod +x ~/bin/recp

Usage
Lets assume, that you have tried to copy file1 to file2 with the command

cp file1 file2

and that the copying process has somehow been interrupted. Now, you can simply resume the copying with the command

recp file1 file2

Issues
Please be aware, that since the script uses dd to continue copying it is both processor intensive and slow.

Code

#!/bin/bash

#set -x

if [ $# -ne 2 ]
then
	echo $0: Usage: $0 original copy
	exit 1
fi

# We need some more meaningful names.
ORIGINAL="$1"
COPY="$2"

if [ ! -f "$ORIGINAL" ]
then
	# ORIGINAL wasn't found.
	echo $0: "$ORIGINAL": No such file
	exit 1
fi

# Calculate the number of bytes to skip before we start copying.
if [ -f "$COPY" ]
then
	# This is a continuation of earlier, interrupted copy.

	WC_OUTPUT=$(wc --bytes "$COPY")

	# Since wc pads its output with spaces making it hard to reliably
	# parse, we have to do a little hack job:

	# Make sure there's at least one space at the beginning.
	WC_OUTPUT=" $WC_OUTPUT"

	# Sqeeze out excess spaces, making the size the second field.
	SKIP_BYTES=$(echo "$WC_OUTPUT" | tr -s ' ' | cut -d' ' -f2)
else
	# This is the first attempt at copying--there's no COPY yet.
	SKIP_BYTES=0
fi

# Do the actual copying.
dd if="$ORIGINAL" of="$COPY" conv=notrunc bs=1 skip="$SKIP_BYTES" seek="$SKIP_BYTES"

Credits:
Forum post on inuxquestions.org

Share and Enjoy:
  • Digg
  • del.icio.us
  • Facebook
  • Google
Categories: bash, linux, n800, ssh, T60 Tags:
  1. January 4th, 2011 at 04:46 | #1

    Actually, rsync can resume. If the download is via http/ftp wget -c IS the way to go.
    If the download is via ssh or local – http://ubuntu-answers.blogspot.com/2010/12/resuming-cp-or-scp-downloads.html

  2. admin
    January 15th, 2011 at 20:17 | #2

    rsync is a good alternative. The above script is intended to resume a local copy command.

  1. October 16th, 2008 at 11:32 | #1