Comment copier un fichier en préservant le chemin du répertoire sous Linux?

88

J'ai des projets Eclipse et un fichier ".project", la structure des répertoires ressemble à ' myProject/.project'. Je veux copier ces fichiers '.project' dans un autre répertoire, mais je veux que le nom du répertoire qui l'entoure soit préservé.

Disons que j'ai a/myProject/.project", je veux copier" myProject/.projectsur b", donc b/myProject/.project", mais b/myProject"n'existe pas. Quand j'essaye dans un:

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

il copie uniquement le fichier '.project' lui-même, sans le répertoire 'myProject'. S'il vous plaît donnez votre avis.

dhblah
la source

Réponses:

153

Le commutateur dont vous avez besoin est --parents, par exemple:

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
la source
7

Utilisez taravec quelque chose comme:

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

(Non testé. Faites un essai préalable ou essayez un scénario de maquette.)

lorenzog
la source
fonctionne étonnamment bien! Sur mac: mkdir b; tar -c -f new.tar $ (cat myP); tar -x -f new.tar -C b /; #myP est un fichier texte avec la liste des chemins d'accès aux fichiers à copier
alexey
4

Commencez mkdir -ppar créer le dossier de destination avec création de chemin parent récursif. Puis copiez le contenu dans le dossier de destination:

mkdir -p b/myProject/.project
cp -r a/myProject/.project/file b/myProject/.project
Weimin
la source
3
cp -P a/myProject/.project b

Voir man cppour plus d'informations.

Maxfer
la source
Cela ne semble pas aider. Il ne copie que ".project" dans b, mais ne copie pas "myProject".
dhblah
3

J'utilise cpio en combinaison avec find. Explication ici .

Exemple pour votre cas d'utilisation:

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

Cette commande trouve tous les fichiers /a/myProject/.project/et les copie, tout en préservant le chemin, tous les fichiers qu’ils contiennent.

Alex Avlonitis
la source
1
.project est un fichier, pas un dir!
ddbug
1

De plus, --parentsil est également nécessaire d’ajouter une -roption pour éviter d’omettre la copie de la plupart des répertoires internes.

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

Donc, la commande qui fonctionne pour moi est

$ cp --parents -r test/1/.moo test2/
cml.co
la source
0

S'il vous plaît être conscient qu'il semble y avoir un bogue dans cp --parents. Lorsque j'ai utilisé --parentsavec --preserve=all, les attributs de date et heure de CERTAINS répertoires de destination n'étaient PAS conservés.

Le lien suivant semble confirmer qu'il s'agit d'un bogue: bogue n ° 8767: cp: --preserve = tout ne fonctionne pas pour les parents lorsque --parent est utilisé .

Il semble donc que vous ne pouvez pas compter sur la conservation d'attributs lors de l'utilisation --parentsde tels que --preserve=allou -p.

chandra67
la source
-3

J'ai utilisé --parentsavec la cpcommande et travaillé parfaitement avec moi. pour plus de détails, utilisez toujours le manuel. Je vous remercie.

sys0dm1n
la source
3
N'ajoute rien aux 5 autres réponses.
Deer Hunter
Répondeurs, veuillez noter que .project dans Eclipse est un fichier, pas un répertoire. Par exemple, mkdir -pa / .project n'a aucun sens.
ddbug