134

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.

9 Answers 9

224

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
3
  • Note that the --parents flag requires -r as well, otherwise it fails.
    – Moshe Zvi
    Jan 27, 2022 at 20:33
  • 1
    @MosheZvi It fails only when cp --parents <SOME DIRECTORY> <DESTINATION> is used. Feb 11, 2022 at 16:14
  • 1
    i know this is *nix but I did try on macOS and --parents option does not exist Nov 14, 2022 at 5:26
40

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

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

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

1
  • works surprisingly well! On mac: mkdir b; tar -c -f new.tar $(cat myP); tar -x -f new.tar -C b/; #myP is text file with list of paths-to-files to be copied
    – alexey
    Aug 23, 2016 at 21:14
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
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.

2
  • 1
    .project is a file, not dir!
    – ddbug
    Oct 15, 2016 at 11:12
  • This is most flexible as you can pick the files/directories to be copied, discard the -v option to avoid verbose outputs, and add the --quiet option can suppress the "xx blocks" at the end.
    – jasxun
    Jul 9, 2021 at 23:17
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/
2
cp -P a/myProject/.project b

See man cp for more information.

2
  • This doesn't seem to help. It only copies '.project' itself into b, but it doesn't copy 'myProject'.
    – dhblah
    Sep 14, 2010 at 8:11
  • -P is don't follow symbolic links Mar 10 at 11:34
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.

-2

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

2
  • 3
    Doesn't add anything to the other 5 answers. May 15, 2015 at 8:40
  • Answerers please note that .project in Eclipse is a file, not directory. So e.g. mkdir -p a/.project makes no sense.
    – ddbug
    Oct 15, 2016 at 11:10

You must log in to answer this question.

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