135 votes

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

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

Disons que j'ai 'a/monProjet/.project', je veux copier 'monProjet/.project' dans 'b', donc cela deviendrait 'b/monProjet/.project', mais 'b/monProjet' n'existe pas. Lorsque j'essaie dans a :

 cp -r ./monProjet/.project ../b

cela copie seulement le fichier '.project' lui-même, sans le répertoire 'monProjet'. Veuillez m'indiquer la marche à suivre.

0 votes

227voto

James Yale Points 4942

L'interrupteur 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

0 votes

Veuillez noter que le drapeau --parents nécessite également -r, sinon cela échoue.

1 votes

@MosheZvi Cela échoue seulement lorsque cp --parents est utilisé.

2 votes

Je sais que c'est *nix mais j'ai essayé sur macOS et l'option --parents n'existe pas.

44voto

alecbz Points 369

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

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

10voto

Rakesh Agarwal Points 773

Utilisez tar avec quelque chose comme :

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

(Non testé. Faites d'abord un essai à vide ou essayez dans un scénario fictif.)

0 votes

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 une liste de chemins de fichiers à copier

5voto

Weimin Points 51

Tout d'abord, utilisez mkdir -p pour créer le dossier de destination avec la création récursive du chemin parent. Ensuite, copiez le contenu dans le dossier de destination :

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

5voto

Alex Avlonitis Points 41

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, en préservant le chemin, tous les fichiers qu'il contient.

1 votes

.project est un fichier, pas un répertoire!

0 votes

Ceci est le plus flexible car vous pouvez choisir les fichiers/répertoires à copier, supprimer l'option -v pour éviter les sorties verbeuses, et ajouter l'option --quiet peut supprimer les "xx blocks" à la fin.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X