How to confirm that a file has copied to a new disk without any errors?
or a piece of software that would do the copying for me and confirm that all the bits are exactly the same.


This is what rsync does. It can copy one file, entire trees of files, just about anything really. And it does it with a reliable algorithm. At the end of an rsync you can be confident the sink got exactly what you sent it from the source.

There's a GUI for rsync called arRsync that can make working with it a little friendlier, though it doesn't work for rsync-over-ssh calls.

The other advantage to rsync is it can do resume-on-interrupt copying. Particularly nice if you're copying lots of files or even big files over networks that are less than reliable.

If you're copying a local drive and a network that are both available to the same Mac you can do:

rsync -avz /Volumes/LocallyAttachedDrive/path/to/big-movie.mov /Volumes/RemoteShare/path/


And you're all done.

If it's a directory (which bundles like .app are) you can do a complete, recursive copy with:

rsync -avz /Volumes/LocallyAttachedDrive/path/to/my-bundle.app /Volumes/RemoteShare/path/


If you don't have Finder/Bonjour-level access to the sink you can do rsync-over-ssh:

rsync -avz /Volumes/LocallyAttachedDrive/path/to/my-bundle.app remoteuser@remotehost:/Volumes/RemoteShare/path/


A shared key can be generated so you don't have to enter a password if you like.

Edit: you can use rsync to verify if two trees are the same with the --dry-run/-n option. If I have the source tree /Volumes/dir and I've copied it to /Volumes/ConnectedDrive/dir I can compare them with:

rsync -acvn /Volumes/dir /Volumes/ConnectedDrive/


The output will tell me if any files need to be copied to the sink in order to make the sink equal the source.

For example, if I sync'ed two trees:

&gt; rsync -avz ./8779 ./a/
building file list ... done
8779/
8779/.DS_Store
8779/logs/
8779/logs/MasterLog.txt
8779/logs/StartLog.txt

sent 893980 bytes  received 98 bytes  596052.00 bytes/sec
total size is 10034671  speedup is 11.22


Comparing them for equality should yield no operations required:

&gt; rsync -acvn ./8779 ./a/
building file list ... done

sent 213 bytes  received 20 bytes  155.33 bytes/sec
total size is 10034671  speedup is 43067.26


If sink was slightly different we'd see output like this:

&gt; echo foo &gt;&gt; a/8779/logs/MasterLog.txt 

&gt; rsync -acvn ./8779 ./a/              
building file list ... done
8779/logs/MasterLog.txt

sent 219 bytes  received 26 bytes  490.00 bytes/sec
total size is 10034671  speedup is 40957.84


Now we know the MasterLog.txt file isn't the same.