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
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.
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.
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/
où ~/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 /
mkdir -p `dirname /nosuchdirectory/hi.txt` && cp -r urls-resume /nosuchdirectory/hi.txt
on peut aussi utiliser la commande find
:
find ./ -depth -print | cpio -pvd newdirpathname
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
rsync est un travail!
#file:
rsync -aqz _vimrc ~/.vimrc
#directory:
rsync -aqz _vim/ ~/.vim
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
é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