web-dev-qa-db-fra.com

Comment faire en sorte que la commande cp crée les dossiers nécessaires à la copie d'un fichier dans une destination

Lorsque vous copiez un fichier en utilisant cp dans un dossier existant ou non, comment puis-je obtenir cp pour créer le dossier si nécessaire? Voici ce que j'ai essayé:

[root@file nutch-0.9]# cp -f urls-resume /nosuchdirectory/hi.txt
cp: cannot create regular file `/nosuchdirectory/hi.txt': No such file or directory
407
omg

Pour développer la réponse de Christian, le seul moyen fiable de le faire serait de combiner mkdir et cp:

mkdir -p /foo/bar && cp myfile "$_"

Par ailleurs, lorsque vous n'avez besoin que de créer un seul répertoire dans une hiérarchie existante, rsync peut le faire en une seule opération. Je suis assez fan de rsync en tant que remplaçant beaucoup plus polyvalent cp, en fait:

rsync -a myfile /foo/bar/ # works if /foo exists but /foo/bar doesn't.  bar is created.
240
lhunath

Je ne savais pas que tu pouvais faire ça avec cp.

Vous pouvez le faire avec mkdir ..

mkdir -p /var/path/to/your/dir

EDIT Voir la réponse de de lhunath pour incorporer cp.

99
Christian

Pour ceux qui utilisent Mac OSX, le moyen le plus simple de contourner ce problème consiste à utiliser idem (uniquement sur Mac, autant que je sache). Cela créera la structure de répertoire qui manque dans la destination.

Par exemple, j'ai fait ça

ditto 6.3.2/6.3.2/macosx/bin/mybinary ~/work/binaries/macosx/6.3.2/

~/work ne contenait pas le répertoire des fichiers binaires avant l'exécution de la commande.

Je pensais que rsync devrait fonctionner de la même manière, mais il semble que cela ne fonctionne que pour un niveau de répertoires manquants. C'est,

rsync 6.3.3/6.3.3/macosx/bin/mybinary ~/work/binaries/macosx/6.3.3/

fonctionné, car ~/work/binaries/macosx existait mais pas ~/work/binaries/macosx/6.3.2 /

24
eythort
 mkdir -p `dirname /nosuchdirectory/hi.txt` && cp -r urls-resume /nosuchdirectory/hi.txt
20
Jamie McCrindle

Il n'y a pas une telle option. Ce que vous pouvez faire est d’exécuter mkdir -p avant de copier le fichier

J'ai créé un script très cool que vous pouvez utiliser pour copier des fichiers dans des emplacements inexistants

#!/bin/bash
if [ ! -d "$2" ]; then
    mkdir -p "$2"
fi
cp -R "$1" "$2"

Maintenant, enregistrez-le, donnez-lui les autorisations et exécutez-le à l'aide de

./cp-improved SOURCE DEST

J'ai mis l'option -R mais c'est juste un brouillon, je sais que ça peut l'être et que vous l'améliorerez de plusieurs façons. J'espère que ça vous aide

18
victor hugo

On peut aussi utiliser la commande find:

find ./ -depth -print | cpio -pvd newdirpathname
16
Jeff King

rsync c'est du travail!

#file:
rsync -aqz _vimrc ~/.vimrc

#directory:
rsync -aqz _vim/ ~/.vim
10
Chu-Siang Lai