web-dev-qa-db-fra.com

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

J'ai des projets Eclipse et un fichier ".project", la structure du répertoire 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 conservé.

Disons que j'ai 'a/myProject/.project ', Je veux copier' myProject/.project 'à' b ', donc ce sera' 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.

90
dhblah

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
161
James Yale

Vous pouvez aussi utiliser rsync -R, qui fonctionne sur OSX où cp --parents n'est pas disponible.

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

20
Alec

Utilisez tar avec quelque chose comme:

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

(Non testé. Essayez-le d'abord à sec ou essayez dans un scénario de maquette.)

9
lorenzog

Première utilisation mkdir -p pour créer le dossier de destination avec la création récursive du chemin parent. Copiez ensuite le contenu dans le dossier de destination:

mkdir -p b/myProject/.project
cp -r a/myProject/.project/file b/myProject/.project
5
Weimin
cp -P a/myProject/.project b

Voir man cp pour plus d'informations.

3
Maxfer

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 dans /a/myProject/.project/ et copie, tout en préservant le chemin, tous les fichiers contenus dans celui-ci.

3
Alex Avlonitis

En plus de --parents il est également nécessaire d'ajouter -r option afin d'é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/
2
cml.co

Veuillez noter qu'il semble y avoir un bogue dans cp --parents. Quand j'ai utilisé --parents de même que --preserve=all, les attributs de date et d'heure de QUELQUES répertoires de destination n'ont PAS été conservés.

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

Il semble donc que vous ne pouvez pas compter sur la préservation des attributs lors de l'utilisation de --parents ainsi que --preserve=all ou -p.

0
chandra67