Aller au contenu

Copier, déplacer et renommer : cp et mv

Terminal

Objectif de cet atelier pratique

  • Prise en main des opérations de copie, de déplacement et de renommage de fichiers

Copier des fichiers et des répertoires avec cp

La commande cp (copy) sert à copier des fichiers. Dans son utilisation la plus basique, elle duplique un fichier d'un endroit à un autre. Prenons par exemple un fichier de notre répertoire ~/Documents et copions-le dans le répertoire /tmp :

$ cd ~/Documents
$ ls -l livres.txt
-rw-r--r--. 1 microlinux microlinux 55 20 sept. 10:05 livres.txt
$ cp livres.txt /tmp/
$ ls -l /tmp/livres.txt
-rw-r--r--. 1 microlinux microlinux 55 21 sept. 06:36 /tmp/livres.txt

Pour copier des répertoires entiers avec leur contenu, il faudra invoquer cp avec l'option -R (comme recursive, « récursif »). Dans l'exemple, j'utilise en plus l'option -v qui explicite bien chaque détail de l'opération :

$ cd
$ tree Fichiers/
Fichiers/
├── Documents
│   └── texte.txt
├── Films
│   └── film.avi
└── Images
    └── photo.jpg

3 directories, 3 files
$ cp -Rv Fichiers/ /tmp/
'Fichiers/' -> '/tmp/Fichiers'
'Fichiers/Images' -> '/tmp/Fichiers/Images'
'Fichiers/Images/photo.jpg' -> '/tmp/Fichiers/Images/photo.jpg'
'Fichiers/Films' -> '/tmp/Fichiers/Films'
'Fichiers/Films/film.avi' -> '/tmp/Fichiers/Films/film.avi'
'Fichiers/Documents' -> '/tmp/Fichiers/Documents'
'Fichiers/Documents/texte.txt' -> '/tmp/Fichiers/Documents/texte.txt'
$ tree /tmp/Fichiers/
/tmp/Fichiers/
├── Documents
│   └── texte.txt
├── Films
│   └── film.avi
└── Images
    └── photo.jpg

3 directories, 3 files

Voici maintenant une utilisation de cp qui peut ressembler (de loin) au quotidien réel d'un administrateur système.

  • Créez un fichier de configuration config dans votre répertoire personnel.

  • Effectuez-en ensuite une copie de sauvegarde config.orig, qui représentera en quelque sorte l'état initial de votre fichier de configuration.

  • Maintenant, modifiez config, en ajoutant une ligne par exemple.

Vos fichiers ne sont désormais plus les mêmes.

$ cd
$ cat > config << EOF
> Option 1
> Option 2
> Option 3
> EOF
$ cp -v config config.orig
'config' -> 'config.orig'
$ ls -l config*
-rw-r--r--. 1 microlinux microlinux 27 21 sept. 06:42 config
-rw-r--r--. 1 microlinux microlinux 27 21 sept. 06:43 config.orig
$ echo Option 4 >> config
$ ls -l config*
-rw-r--r--. 1 microlinux microlinux 36 21 sept. 06:43 config
-rw-r--r--. 1 microlinux microlinux 27 21 sept. 06:43 config.orig

Utiliser le joker

Dans ce dernier exemple, j'ai introduit une petite nouveauté qui semblera familière aux vétérans de MS-DOS, même si son fonctionnement diffère quelque peu : le joker1 *. L'astérisque * signifie « n'importe quelle chaîne de caractères ». Si cela ne vous paraît pas très parlant, pensez aux jeux de cartes, où le joker signifie « n'importe quelle carte », ou encore aux petites lettrines immaculées du Scrabble, celles qui endossent le rôle de n'importe quelle lettre salvatrice au milieu de notre « WGTHRX ». Là encore, prenons un exemple.

Depuis que nous avons entrepris notre initiation à la ligne de commande, les fichiers et les répertoires s'entassent dans notre répertoire personnel. Le prochain atelier pratique sera d'ailleurs consacré aux commandes de suppression, ce qui nous permettra d'envisager un brin de ménage. Pour l'instant, vous devez faire avec tout ce fatras. Admettons que vous ne vouliez afficher des renseignements précis que sur vos seuls fichiers dont le nom commence par bonjour. Vous pourriez très bien expliciter à la suite les quatre fichiers en argument :

$ cd ~/Documents/
$ ls -l bonjour.txt bonjour2.txt bonjour3.txt bonjourtous.txt
-rw-r--r--. 1 microlinux microlinux 17 21 sept. 06:57 bonjour2.txt
-rw-r--r--. 1 microlinux microlinux 22 21 sept. 06:57 bonjour3.txt
-rw-r--r--. 1 microlinux microlinux 58 21 sept. 06:57 bonjourtous.txt
-rw-r--r--. 1 microlinux microlinux 19 21 sept. 06:56 bonjour.txt

Toutefois, il y a moyen de faire plus court :

$ ls -l bonjour*
-rw-r--r--. 1 microlinux microlinux 17 21 sept. 06:57 bonjour2.txt
-rw-r--r--. 1 microlinux microlinux 22 21 sept. 06:57 bonjour3.txt
-rw-r--r--. 1 microlinux microlinux 58 21 sept. 06:57 bonjourtous.txt
-rw-r--r--. 1 microlinux microlinux 19 21 sept. 06:56 bonjour.txt

Les habitués de MS-DOS verront tout de suite la différence. Sous Windows, le joker aurait dû être invoqué sous la forme BONJOUR*.*, voire BONJOUR*.TXT.

Sauvegarder un répertoire

Pour en revenir à cp, je peux également copier l'intégralité d'un répertoire vers un répertoire d'un autre nom :

$ cd
$ cp -Rv Fichiers CopieFichiers
'Fichiers' -> 'CopieFichiers'
'Fichiers/Images' -> 'CopieFichiers/Images'
'Fichiers/Images/photo.jpg' -> 'CopieFichiers/Images/photo.jpg'
'Fichiers/Films' -> 'CopieFichiers/Films'
'Fichiers/Films/film.avi' -> 'CopieFichiers/Films/film.avi'
'Fichiers/Documents' -> 'CopieFichiers/Documents'
'Fichiers/Documents/texte.txt' -> 'CopieFichiers/Documents/texte.txt'

Admettons maintenant que je souhaite effectuer une copie complète du répertoire Fichiers et de tout son contenu vers un autre endroit du système, tout en donnant un autre nom au répertoire copié, par exemple Sauvegarde20250921. Dans ce cas, voici ce qu'il faut faire :

$ cp -Rv Fichiers /tmp/Sauvegarde20250921
'Fichiers' -> '/tmp/Sauvegarde20250921'
'Fichiers/Images' -> '/tmp/Sauvegarde20250921/Images'
'Fichiers/Images/photo.jpg' -> '/tmp/Sauvegarde20250921/Images/photo.jpg'
'Fichiers/Films' -> '/tmp/Sauvegarde20250921/Films'
'Fichiers/Films/film.avi' -> '/tmp/Sauvegarde20250921/Films/film.avi'
'Fichiers/Documents' -> '/tmp/Sauvegarde20250921/Documents'
'Fichiers/Documents/texte.txt' -> '/tmp/Sauvegarde20250921/Documents/texte.txt'

Le seul aspect peu réaliste de ce dernier exemple, c'est que /tmp n'est pas un endroit approprié pour ranger des sauvegardes. De meilleurs endroits seront à découvrir un peu plus loin.

La barre oblique / à la fin des répertoires

Certains parmi vous auront probablement remarqué une petite incohérence dans l'utilisation de / à la fin des noms de répertoires. Concrètement, lorsque je copie un répertoire Fichiers, je peux écrire cp Fichiers/ CopieFichiers ou bien cp Fichiers CopieFichiers. La barre oblique s'ajoute d'emblée à la fin d'un nom de répertoire lorsque j'utilise la complétion automatique, comme nous le verrons un peu plus loin.

Déplacer des fichiers et des répertoires avec mv

La commande mv (move comme « bouger ») sert à déplacer des fichiers :

$ cd ~/Documents/
$ mv bonjour.txt /tmp/

Le fichier ~/Documents/bonjour.txt a été déplacé vers le répertoire /tmp.

mv ne s'applique pas seulement sur des fichiers, mais également sur des répertoires entiers. Pour essayer, créez une autre copie du répertoire Fichiers et déplacez-la vers /tmp :

$ cd
$ cp -R Fichiers/ AutreCopieFichiers
$ mv AutreCopieFichiers/ /tmp/

Question épineuse : comment déplacer à nouveau le fichier /tmp/bonjour.txt vers mon répertoire ~/Documents lorsque je me trouve dans ce dernier ? Voici la réponse :

$ cd ~/Documents/
$ mv /tmp/bonjour.txt .

Et je pourrais faire de même avec /tmp/AutreCopieFichiers :

$ cd
$ mv /tmp/AutreCopieFichiers .

Rappelez-vous que le point . signifie « ici ». La première des deux commandes précédentes peut se lire littéralement comme ceci : « déplace (mv) le fichier bonjour.txt qui se situe dans le répertoire /tmp (/tmp/bonjour.txt) vers ici (.) ».

Renommer des fichiers et des répertoires avec mv

La commande mv ne sert pas seulement à déplacer, mais aussi à renommer des fichiers et des répertoires.

Une seule commande pour déplacer et renommer des fichiers

Cette double utilisation de mv tourmente habituellement les novices de la ligne de commande sous Linux. Rassurez-vous : ce n'est qu'une simple habitude à prendre. Un expert venant d'un autre système d'exploitation mettra un peu moins de trois mois à s'y habituer. Et un enfant de dix ans aura assimilé ce double fonctionnement en moins de trois minutes. :o)

$ cd ~/Documents
$ mv bonjour.txt hello.txt

Là, nous venons tout simplement de renommer le fichier bonjour.txt en hello.txt.

Pour ajouter à la confusion, demandons-nous s'il existe un moyen de déplacer ce fichier hello.txt vers /tmp, tout en le renommant par la même opération en bonjour.txt ? Oui, et c'est même très simple :

$ mv hello.txt /tmp/bonjour.txt

  1. J'évite d'utiliser les traductions françaises comme « caractère générique » ou « métacaractère », tout juste aptes à séduire les penseurs postmodernes.