Scenario / Questions

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.

Find below all possible solutions or suggestions for the above questions..

Suggestion: 1

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

Suggestion: 2

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

Suggestion: 3

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.)

Suggestion: 4

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

Suggestion: 5
cp -P a/myProject/.project b

See man cp for more information.

Suggestion: 6

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.

Suggestion: 7

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/

Suggestion: 8

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

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

Suggestion: 9

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