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

12

Je veux cpun fichier dans un autre répertoire mais ce répertoire n'existe pas encore.

Je ferais donc:

mkdir /new_place
cp the_file /new_place

Puis-je faire cela en un seul?
J'imagine quelque chose comme cp the_file -m /new_placesi "m" signifiait "faire des dir qui n'existent pas"

Serait-ce une chance d'utiliser scp, rsync ou un autre utilitaire de copie?

Michael Durrant
la source

Réponses:

17

Avec, --parentsvous 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/Downloadspuis les copier test.txtdans celui-ci; et

cp --parents Downloads/test.txt ~/Desktop/

va créer ~/Desktop/Downloads.

desgua
la source
5

Vous pouvez le faire avec la commande suivante

# rsync --recursive the_file /path/to/your/dir/that/doesn't/exists/

Remarque: Utilisation de "/" à la fin du chemin:

  • Lorsque vous utilisez "/" à la fin de la source, rsync copiera 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éera un dossier avec le dernier nom de dossier de destination et collera les données à l'intérieur de ce dossier.

OrangeTux
la source
Si vous le souhaitez, the_filevous devez ajouter un /à la fin de votre nouveau chemin de répertoire.
mfink
1

la réponse de desgua est un moyen approprié et simple, mais que faire si vous avez besoin d'un moyen protable? POSIX définit cpsans --parentindicateur, donc cela ne fonctionnera pas sur tous les systèmes.

Une option consiste à l'écrire en 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
Sergiy Kolodyazhnyy
la source
0

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

mkdir folder; cp file.html folder

et ça devrait marcher.

Galja Moehn
la source