Linux file copy with ETA?

5,663

Solution 1

Use rsync --human-readable --progress.

For single files and block devices there's also pv. And if you genuinely need an accurate progress bar, try using tar with pv — something like this:

source=/the/source/directory
target=/the/target/directory
size=$(du -sx "$source")
cd "$source"
find . xdev -depth -not -path ./lost+found -print0 \
    | tar --create --atime-preserve=system --null --files-from=- \
          --format=posix --no-recursion --sparse \
    | pv --size ${size}k \
    | { cd "$target"; \
        tar --extract --overwrite --preserve-permissions --sparse; }

Be warned, however, that GNU tar does not yet support ACLs or extended attributes, so if you are copying filesystems mounted with the "acl" or "xattrs" options, you need to use rsync (with the "--acls" and "--xattrs" options). Personally, I use:

rsync --archive --inplace --hard-links --acls --xattrs --devices --specials \
    --one-file-system --8-bit-output --human-readable --progress /source /target

Also look into whether you want to use the --delete and/or --numeric-ids options.

Solution 2

Instead of dd I would suggest pv, e.g.:

% tar -cf - INPUT | pv -rbe -s SIZE | tar -xf - -C DEST 

Solution 3

Have you tried rsync -P? If you're using dd, e.g. tar -cf - src | dd | (cd dest; tar -xf -) you should be able to use Ctrl-T (SIGINFO) to see your progress.

Share:
5,663

Related videos on Youtube

Shaheryar
Author by

Shaheryar

Updated on September 17, 2022

Comments

  • Shaheryar
    Shaheryar over 1 year

    I'm copying a large amount of files between disks. There's approximately 16 GB of data. I'd like to see progress information, and even an estimated time of completion from the command line.

    Any advice?

  • alex
    alex almost 14 years
    Was posting that. However, be aware that it doesn't provide a reliable "progress over total copy time". However, rsync brings many benefits to this kind of stuff.
  • Teddy
    Teddy almost 14 years
    Linux doesn't even have SIGINFO.
  • Jeremy Visser
    Jeremy Visser almost 14 years
    When copying with dd I send SIGUSR1 to dd instead to cause it to print the statistics. A simple killall -USR1 dd will do the job. (Which works on Linux, even if, as Teddy points out, Ctrl+T doesn’t work.)