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