Subject: cp and mv with single wild card argument acts as if multiple arguments were entered.
From: Darwin Gregory <[email-masked]>
To: [email-masked]
Date: Fri, 4 Jun 2010 12:13:46 -0400
List-Id: <debbugs-submit.debbugs.gnu.org>

I did a quick search of the archive, and didn't find this one, but there
seems to be a potential logical failure in the cp and mv commands.  It may
be specific to an implementation, but I feel it is a critical issue.

I have tested this on Suse Enterprise 10.x and OpenSuse 11.x (the only
implementations I currently have access to).

If you execute "cp /path/*" the command expands the wildcard, and treats the
last file as the destination directory.  If the last file in /path/ is not a
directory the command fails, but not with the appropriate error.  However,
if the last file in the directory (or other wildcard expansion) is a
directory, it will copy all earlier files in the expansion to that
directory.

The same happens for mv.  I did mv * in my home directory where the last
entry was a workspace subdirectory.  It moved all of my files and
directories to my workspace subdirectory.

I feel this is an unacceptable outcome for a single argument that is a
wildcard, since whether it works or not is based on the arbitrary presence
or absence of a directory as the final element in the wildcard expansion.
It would be much better to fail with an error indicating  "missing
destination file operand" as it does if the first argument does not
contain a wildcard.

Also, if a wildcard expansion contains exactly 2 elements, the second is
treated as a target whether or not it is a directory, causing a potential
overlay of data.

... Darwin