Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I go with the following in bash

cp -r "/wordpress/3.0.1/" "/mySite/"

and the result is /mySite/3.0.1/ but I don't want nor understand why the 3.0.1/ appears in the target destination.

What am I doing wrong?

share|improve this question
up vote 0 down vote accepted

cp -r /wordpress/3.0.1/* /mySite

share|improve this answer
That won't copy any file in /wordpress/3.0.1/ whose name begins with a .. Better use cp -r /wordpress/3.0.1/. /mySite/. – Gilles Nov 5 '10 at 22:06
@Gilles I'll give it a try, tx – fabjoa Nov 5 '10 at 23:12

This is a deviation from the POSIX specification, which states that

A pathname that contains at least one non-slash character and that ends with one or more trailing slashes shall be resolved as if a single dot character ( '.' ) were appended to the pathname.

But under Linux (i.e. with the cp command from GNU coreutils, cp -r foo/ bar/ acts like cp -r foo bar/ rather than cp -r foo/. bar/ when foo is a directory¹. (GNU coreutils isn't the only culprit, I just observed the same behavior in OpenBSD which is usually good at standards compliance.)

You can run cp -r "/wordpress/3.0.1/." "/mySite/" (i.e. end the source with /.) to avoid the 3.0.1/ level. Another possibility is rsync -r "/wordpress/3.0.1/" "/mySite/".

As an aside, I recommend getting into the habit of cp -a rather than cp -r if you don't use unices other than Linux and Cygwin. When you notice the difference, -a (which preserves permissions and symbolic links) is usually the right one. On other unices, use cp -Rp. With rsync, use -a.

share|improve this answer
Thanks! Is the use of double quotes to capture the path important? – fabjoa Nov 5 '10 at 23:15
@fabjoa: Here the double quotes are not necessary. You will often find them in (well-written) scripts, because they are necessary around variable substitutions (e.g. cp -- "$1" "$destination"). When the file name is specified directly, quotes are necessary only if the name contains characters that are special to the shell, such as spaces; single quotes (apostrophes) 'foo' would be more common because they protect everything except single quotes. (Shell quoting rules are complicated.) – Gilles Nov 6 '10 at 0:26
@Gilles I'm confused by "cp -r foo/ bar/ acts like cp -r foo bar/ rather than cp -r foo bar/" - I'd expect that the last two should be different? – Volker Siegel Jul 24 '14 at 4:15
@VolkerSiegel I meant “rather than cp -r foo/. bar/”. Fixed, thanks. – Gilles Jul 24 '14 at 7:35

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .