Comment faire pour que la commande cp crée les dossiers nécessaires pour copier un fichier vers une destination [dupliquer]

cette question a déjà une réponse ici:

lors de la copie d'un fichier en utilisant cp vers un dossier qui peut ou non exister, Comment puis-je obtenir cp pour créer le dossier si nécessaire? Ici est 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
351
demandé sur Mark Amery 2009-06-04 04:11:41

9 réponses

pour développer la réponse de Christian, la seule façon fiable de le faire serait de combiner mkdir et cp :

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

comme mise à part, lorsque vous n'avez besoin de créer qu'un seul répertoire dans une hiérarchie existante, rsync peut le faire en une seule opération. Je suis tout à fait un fan de rsync comme un beaucoup plus polyvalent cp remplacement, en fait:

rsync -a myfile /foo/bar/ # works if /foo exists but /foo/bar doesn't.  bar is created.
193
répondu lhunath 2012-12-29 19:24:50

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 lhunath pour l'incorporation du cp.

83
répondu Christian 2017-05-23 12:34:44

pour ceux qui sont sur Mac OSX, peut-être la meilleure façon de travailler autour de cela est d'utiliser ditto (seulement sur le mac, AFAIK, si). Il va créer la structure de répertoire qui manque dans la destination.

par exemple, je l'ai fait

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

~/work ne contenait pas le répertoire des binaires avant que j'exécute la commande.

j'ai pensé que rsync devrait fonctionner de la même façon, mais il semble elle ne fonctionne que pour un niveau de répertoires manquants. C'est-à-dire,

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

a fonctionné, parce que ~ / work / binaires / macosx existait mais pas ~/work / binaires / macosx/ 6.3.2 /

20
répondu eythort 2012-12-28 17:42:19
 mkdir -p `dirname /nosuchdirectory/hi.txt` && cp -r urls-resume /nosuchdirectory/hi.txt
16
répondu Jamie McCrindle 2014-02-09 15:22:16

on peut aussi utiliser la commande find :

find ./ -depth -print | cpio -pvd newdirpathname
15
répondu Jeff King 2012-11-14 19:05:06

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 fait un script très cool vous pouvez utiliser pour copier des fichiers dans des endroits qui n'existent pas

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

maintenant, enregistrez-le, donnez-lui les permissions et lancez-le en utilisant

./cp-improved SOURCE DEST

j'ai mis l'option-R, mais c'est juste un projet, je sais que cela peut être et vous permettra d'améliorer de plusieurs façons. Espérer il vous aide

14
répondu victor hugo 2009-06-04 07:19:12

rsync est un travail!

#file:
rsync -aqz _vimrc ~/.vimrc

#directory:
rsync -aqz _vim/ ~/.vim
8
répondu Chu-Siang Lai 2013-05-23 05:59:19
cp -Rvn /source/path/* /destination/path/
cp: /destination/path/any.zip: No such file or directory

il ne créera aucun chemin existant dans la destination, si le chemin a un fichier source à l'intérieur. Cela ne crée pas de répertoires vides.

il y a Un moment j'ai vu xxxxxxxx: Aucun fichier ou répertoire, parce que je n'ai plus d'espace libre. sans message d'erreur.

avec ditto:

ditto -V /source/path/* /destination/path
ditto: /destination/path/any.zip: No space left on device

une fois libéré de l'espace cp -Rvn /source/path/* /destination/path/ fonctionne comme prévu

-5
répondu pedro 2013-03-29 16:07:08

étonnamment, Je ne vois pas la bonne réponse dans ce fil, il suffit d'utiliser:

cp -r /foo/bar/baz /tmp

comme d'habitude, un simple conseil de RTFM est suffisant, le ci-dessus va copier le fichier baz dans / tmp et sous les sous-répertoires foo / bar (ceux-ci seront créés s'ils n'existent pas)

cp --help
-R, -r, --recursive          copy directories recursively
-15
répondu Christophe Eblé 2012-10-29 10:54:00