web-dev-qa-db-fra.com

Comment puis-je copier un fichier dans un nouvel emplacement, en créant également le répertoire

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?

11
Michael Durrant

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.

16
desgua

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.

5
OrangeTux

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
1

Vous pouvez facilement taper deux commandes en utilisant;. Par exemple:

mkdir folder; cp file.html folder

et ça devrait marcher.

0
Galja Moehn