Je veux cp
un fichier dans un autre répertoire mais ce répertoire n'existe pas encore.
Alors je ferais:
mkdir /new_place
cp the_file /new_place
Puis-je faire cela en un?
J'imagine quelque chose comme cp the_file -m /new_place
si "m" signifie "faire des répertoires inexistants"
Serait-ce une chance d'utiliser scp, rsync ou un autre utilitaire de copie?
Avec --parents
, vous pouvez recréer les répertoires de la source à la destination. Par exemple:
cp --parents ~/Downloads/test.txt ~/Desktop/
Va créer les sous-répertoires ~/Desktop/home/desgua/Downloads
et ensuite copier test.txt
dans celui-ci; et
cp --parents Downloads/test.txt ~/Desktop/
va créer ~/Desktop/Downloads
.
Vous pouvez le faire avec la commande suivante
# rsync --recursive the_file /path/to/your/dir/that/doesn't/exists/
Note: Utilisation de "/" à la fin du chemin:
Lorsque vous utilisez "/" à la fin du code source, rsync copie le contenu du dernier dossier. Lorsque vous n'utilisez pas "/" à la fin de la source, rsync copiera le dernier dossier et le contenu du dossier.
Lorsque vous utilisez "/" à la fin de la destination, rsync collera les données dans le dernier dossier. Lorsque vous n'utilisez pas "/" à la fin de la destination, rsync crée un dossier avec le dernier nom de dossier de destination et colle les données à l'intérieur de ce dossier.
la réponse de desgua est un moyen simple et approprié, mais que faire si vous avez besoin d'un moyen protable? POSIX définit cp
sans --parent
, de sorte que cela ne fonctionnera pas sur tous les systèmes.
Une option consiste à l'écrire dans Python s'il est installé sur le système:
#!/usr/bin/env python3
from os import makedirs
from os.path import exists,basename
from shutil import copyfile
from sys import argv
if len(argv) < 3:
print('Not enough args',file=stderr)
exit(1)
filename = basename(argv[2])
dirs = argv[2].replace(filename,'')
makedirs(dirs)
copyfile(argv[1],argv[2])
Cela fonctionne comme suit:
$ ./mkdircp.py /etc/passwd $HOME/foodir/bardir/passwd.copy
$ stat --printf "%F\n" $HOME/foodir/bardir/passwd.copy
regular file
$ head -n 1 $HOME/foodir/bardir/passwd.copy
root:x:0:0:root:/root:/bin/bash
Vous pouvez facilement taper deux commandes en utilisant;. Par exemple:
mkdir folder; cp file.html folder
et ça devrait marcher.