Article original : Copy a Directory in Linux – How to cp a Folder in the Command Line in Linux and Unix (MacOS)
Par John Mosesman
Pour copier des fichiers ou des répertoires dans les systèmes d'exploitation basés sur Unix (Linux et MacOS), on utilise la commande cp.
La commande cp est une commande relativement simple, mais son comportement change légèrement en fonction des entrées (fichiers vs répertoires) et des options que vous lui passez.
Pour consulter la documentation ou le manuel de la commande cp, exécutez man cp dans votre terminal :
$ man cp
NOM
cp -- copier des fichiers
SYNOPSIS
cp [OPTIONS] fichier_source fichier_cible
cp [OPTIONS] fichier_source ... répertoire_cible
...
La forme de base de cette commande prend une source d'entrée (ou des sources) que vous voulez copier (fichiers ou répertoires) et une destination vers laquelle copier les fichiers ou répertoires :
cp [OPTIONS] fichier_source fichier_cible
Comment copier un fichier dans le répertoire courant
Pour copier un fichier, passez le fichier que vous voulez copier et le chemin de l'endroit où vous voulez le copier.
Si vous avez un fichier nommé a.txt et que vous voulez une copie de ce fichier nommée b.txt :
$ ls
a.txt
$ cp a.txt b.txt
$ ls
a.txt b.txt
Si vous ne connaissez pas la commande
ls,ls« liste » tout le contenu d'un répertoire.
Par défaut, la commande cp utilise votre répertoire courant comme chemin.
Comment copier un fichier vers un autre répertoire
Pour copier un fichier vers un répertoire qui est différent de votre répertoire courant, il vous suffit de passer le chemin de l'autre répertoire comme destination :
$ ls ../directory-1/
$ cp a.txt ../directory-1/
$ ls ../directory-1/
a.txt
Après la commande cp, le directory-1 précédemment vide contient désormais le fichier a.txt.
Par défaut, le fichier copié reçoit le nom du fichier d'origine, mais vous pouvez également passer un nom de fichier en option :
$ cp a.txt ../directory-1/b.txt
$ ls ../directory-1/
b.txt
Comment copier plusieurs fichiers dans un répertoire
Pour copier plus d'un fichier à la fois, vous pouvez passer plusieurs sources d'entrée et un répertoire comme destination :
$ ls ../directory-1/
$ cp first.txt second.txt ../directory-1/
$ ls ../directory-1/
first.txt second.txt
Ici, les deux sources d'entrée (first.txt et second.txt) ont toutes deux été copiées dans le répertoire directory-1.
Note : lors du passage de plusieurs sources, le dernier argument doit être un répertoire.
Comment copier un répertoire vers un autre répertoire
Si vous essayez de passer un répertoire comme source d'entrée, vous obtenez cette erreur :
$ cp directory-1 directory-2
cp: directory-1 is a directory (not copied).
Pour copier un répertoire, vous devez ajouter le drapeau -r (ou -R) — qui est l'abréviation de --recursive :
$ ls directory-1
a.txt
$ cp -r directory-1 directory-2
$ ls
directory-1 directory-2
$ ls directory-2
a.txt
Ici, directory-1 contenant le fichier a.txt est copié dans un nouveau répertoire appelé directory-2 — qui contient désormais également le fichier a.txt.
Comment copier le répertoire entier vs le contenu du répertoire
Il existe un cas particulier intéressant lorsque vous copiez un répertoire : si le répertoire de destination existe déjà, vous pouvez choisir de copier le contenu du répertoire ou le répertoire entier en ajoutant ou en supprimant un / final à votre entrée.
Voici la description de l'option -R de la page man :
Si fichier_source désigne un répertoire, cp copie le répertoire et toute l'arborescence connectée à ce point. Si le fichier_source se termine par un /, le contenu du répertoire est copié plutôt que le répertoire lui-même.
Si vous voulez copier uniquement le contenu du répertoire dans un autre répertoire, ajoutez un / final à votre entrée.
Si vous voulez copier le contenu du répertoire et le dossier du répertoire lui-même dans un autre répertoire, n'ajoutez pas de / final :
$ ls
directory-1 directory-2
$ ls directory-2
$ cp -r directory-1 directory-2
$ ls directory-2
directory-1
$ ls directory-2/directory-1
a.txt
Ici, vous pouvez voir que parce que directory-2 existe déjà — et que la source d'entrée n'avait pas de / final — le contenu de directory-1 et le répertoire lui-même ont été copiés dans la destination.
Comment empêcher l'écrasement de fichiers avec cp
Par défaut, la commande cp écrasera les fichiers existants :
$ cat a.txt
A
$ cat directory-1/a.txt
B
$ cp a.txt directory-1/a.txt
$ cat directory-1/a.txt
A
Si vous ne connaissez pas la commande
catou « concatenate », elle affiche le contenu d'un fichier.
Il existe deux façons d'empêcher cela.
Le drapeau interactif
Pour être averti lorsqu'un écrasement est sur le point de se produire, vous pouvez ajouter le drapeau -i ou --interactive :
$ cp -i a.txt directory-1/a.txt
overwrite directory-1/a.txt? (y/n [n])
Le drapeau no-clobber
Ou, pour empêcher les écrasements sans être sollicité, vous pouvez ajouter le drapeau -n ou --no-clobber :
$ cat a.txt
A
$ cat directory-1/a.txt
B
$ cp -n a.txt directory-1/a.txt
$ cat directory-1/a.txt
B
Ici, vous pouvez voir que grâce au drapeau -n, le contenu de directory-1/a.txt n'a pas été écrasé.
Autres options
Il existe de nombreuses autres options utiles à passer à la commande cp : comme -v pour une sortie « verbose » (verbeuse) ou -f pour « force ».
Je vous encourage vivement à lire la page man pour toutes les autres options utiles.
Si vous avez aimé ce tutoriel, je parle aussi de sujets comme celui-ci sur Twitter, et j'écris à leur sujet sur mon site.