135

I have Eclipse projects and ".project" file in them, the directory structure looks like 'myProject/.project'. I want to copy these '.project' files to another directory, but I want the enclosing directory name to be preserved.

Let's say I have 'a/myProject/.project', I want to copy 'myProject/.project' to 'b', so it be 'b/myProject/.project', but 'b/myProject' doesn't exist. When I try in a:

 cp -r ./myProject/.project ../b

it copies only '.project' file itself, without 'myProject' directory. Please advise.

splattne
  • 28,776
dhblah
  • 1,453
  • 2
  • 10
  • 7

9 Answers9

229

The switch you need is --parents, e.g.:

jim@prometheus:~$ cp --parents test/1/.moo test2/
jim@prometheus:~$ ls -la test2/
total 42
drwxr-xr-x   3 jim jim    72 2010-09-14 09:32 .
drwxr-xr-x 356 jim jim 43136 2010-09-14 09:32 ..
drwxr-xr-x   3 jim jim    72 2010-09-14 09:32 test
jim@prometheus:~$ ls -la test2/test/1/.moo
-rw-r--r-- 1 jim jim 0 2010-09-14 09:32 test2/test/1/.moo
James Yale
  • 5,272
44

You can also use rsync -R, which works on OSX where cp --parents isn't available.

https://stackoverflow.com/a/13855290/598940

alecbz
  • 539
  • 4
  • 7
10

Use tar with something like:

mkdir b; tar cpf - myProject/ | tar xpf - -C b/

(Not tested. Give it a dry run first or try in a mockup scenario.)

lorenzog
  • 2,979
5

First use mkdir -p to create the destination folder with recursive parent path creation. Then copy the contents to the destination folder:

mkdir -p b/myProject/.project
cp -r a/myProject/.project/file b/myProject/.project
techraf
  • 4,403
Weimin
  • 51
5

I use cpio in combination with find. Explanation here.

Example for your use case:

find /a/myProject/.project/ -type f | cpio -p -dumv /b/.

This command finds all files in /a/myProject/.project/ and copies, while preserving the path, any files contained within.

techraf
  • 4,403
2
cp -P a/myProject/.project b

See man cp for more information.

techraf
  • 4,403
Maxfer
  • 191
2

Additionally to --parents it is also required to add -r option in order to avoid omitting the copy of most inner directory

$ cp --parents test/1/.moo test2/
cp: omitting directory ‘test/1/.moo’

So the command that works for me is

$ cp --parents -r test/1/.moo test2/
cml.co
  • 121
1

Please be aware that there appears to be a bug in cp --parents. When I used --parents along with --preserve=all, the date and time attributes of SOME destination directories were NOT preserved.

The following link seems to confirm that this is a bug: bug#8767: cp: --preserve=all doesn't work for the parents when --parent is used.

So it looks as though you can't rely on attributes being preserved when using --parents along with such as --preserve=all or -p.

techraf
  • 4,403
-2

I used --parents with the cp command and worked perfeclty with me. for more details always use the manual. Thank you.