Assuming that we're talking of regular files here, in the case of:
cp to_do done
done is not writeable, you'll get an error message. Otherwise, the content of
to_do will be copied over
done. What that means is that
done keeps the same inode, permissions, ownership, birth time. The
-a in some implementations) would try and copy some of the attributes of
cp -f to_do done
If you don't have write access to
cp will first unlink
done (which you'll be able to do as long as you've got write access to the current directory and the current directory doesn't have the
t bit set) and create a new one.
cp will try and copy as many of the attributes of
to_do, like it would if
done didn't exist beforehand.
mv to_do done
to_do is just renamed. It's only the current directory that is modified. If
done existed before hand, it will be unlinked first.