Cette page provient de
https://www.commandeslinux.fr/commande-cp/. Elle a pour objectif de donner, de manière concise, les différentes options importante de la commande cp
La commande cp
cp (copy files) est une commande beaucoup utilisée car cette dernière permet de procéder à des copies de fichiers ou répertoires.
Bien que ce tutoriel soit fait pour les débutants, il est également utile à tous ceux qui souhaitent revoir rapidement des exemples pratiques d'utilisation des diverses options de la commande cp.
Même si vous utilisez la commande cp tous le temps, probablement qu'un ou plusieurs exemples ci-dessous pourront être nouveau pour vous.
La syntaxe générale de commande cp est :
cp [option] source destination
Copier un fichier
Il arrive très souvent de vouloir copier un fichier. Voici un exemple, de la commande cp dans lequel nous copions un fichier nommé « photo.jpg » dans le répertoire « /home/jean/Bureau ».
cp photo.jpg /home/jean/Bureau
Copier un fichier en lui donnant un nom différent
Si l'on souhaite donner un nom différent au fichier qui sera copié il suffit de le préciser dans le deuxième argument de la commande. Dans l'exemple ci-dessous nous copions le fichier photo.jpg vers le répertoire « /home/jean/Bureau » et lui donnons le nom « image.jpg ».
cp /home/jean/photo.jpg /home/jean/Bureau/image.jpg
Il est possible de faire la même chose au sein du répertoire courant dans lequel nous nous trouvons :
Le fichier photo.jpg sera alors recherché au sein du répertoire courant et sera copié en tant qu'image.jpg.
Copier plusieurs fichiers
Comme représenté ci-dessous, vous pouvez copier plusieurs fichiers ou répertoires :
cp photo.jpg image.jpg /home/jean/Bureau
Si les fichiers à copier ont un pattern commun, vous pouvez utiliser les joker, comme dans l'exemple ci-dessous. Dans cet exemple, tous les fichiers ayant l'extension .jpg sont copiés dans /home/jean/Bureau.
cp *.jpg /home/jean/Bureau
Copier un ou plusieurs répertoires
Il est très courant d'avoir besoin de copier un répertoire. L'exemple ci-dessous copie le répertoire /home/jean/vacances dans /home/jean/Bureau. Nous considérons ici que le répertoire /home/jean/Bureau existe déjà. La copie va donné naissance à un nouveau répertoire nommé « vacances » dans /home/jean/Bureau qui sera la copie du répertoire source. L'option -r utilisée ici, signifie récursif, cela à pour fonction de copier tous les sous répertoires existants au sein du répertoire source.
cp -r /home/jean/vacances /home/jean/Bureau
Ci-dessous, nous copions plusieurs répertoires :
cp -r vacances/ images/ /home/jean/Bureau
Copier un répertoire et lui donner un nom différent
Souvent il arrive que nous ayons besoin de changer le nom du répertoire que nous copions. Par exemple, si vous souhaitez faire une copie de sauvegarde; admettons que vous disposiez d'un répertoire nommé « prod » que vous souhaitiez en faire une copie « prod-2 ». Allez à l'endroit où se trouve le répertoire « prod » et tapez la commande suivante :
Il est également possible, le faire depuis un autre répertoire, a ce moment là il faut préciser le chemin:
cp -r /home/prod /home/prod-2
Demande de confirmation avant suppression
La commande cp dispose d'une option souvent employée car présente dans les alias. Lorsque cette option est active la commande cp va demander confirmation avant la suppression de chacun des fichiers. Cette option est disponible grâce aux arguments suivants : -i ou --interactive
cp -i photo.jpg image.jpg
Création automatique d'une archive si le fichier cible existe déjà
La commande cp dispose d'une option très pratique qu'on peut appeler grâce aux arguments --backup ou -b. Cette option permet de créer automatiquement une sauvegarde du fichier cible si jamais ce dernier est déjà existant. Par exemple, en tapant la commande suivante :
cp --backup photo.jpg image.jpg
Le fichier « image.jpg » est automatiquement sauvegardé au lieu d'être écrasé. Le nom du fichier sauvegardé sera « image.jpg~ ».
Préserver les liens symboliques lors de la copie
Lorsque vous exécutez la commande cp, si le fichier source est un lien, alors le fichier réel (cible) est copié et non le lien.
Dans le cas où vous ne voudriez copier que le lien tel quel, spécifiez l'option -d, comme indiqué dans l'exemple ci-après.
L'exemple suivant montre que sans l'option -d, c'est le fichier qui sera copié (et non le lien):
$ ls -l
lrwxrwxrwx 1 romain romain 9 8 juil. 13:13 file.c -> ../file.c
$ cp file.c /home/romain/
$ cd /home/romain/
$ ls -l
-rw-r--r-- 1 romain romain 0 8 juil. 13:14 file.c
Pour préserver le lien lors de la copie, faites comme dans l'exemple ci-dessous :
$ ls -l
lrwxrwxrwx 1 romain romain 9 8 juil. 13:13 file.c -> ../file.c
$ cp -d file.c /home/romain/
$ cd /home/romain/
$ ls -l
lrwxrwxrwx 1 romain romain 9 8 juil. 13:17 file.c -> ../file.c
Mode verbeux
L'option -v permet d'avoir plus d'informations concernant l'action effectuée. Dans l'exemple ci-dessous nous effectuons une copie, et on peut observer que la commande cp ajoute une ligne d'information supplémentaire :
root@debian:~$ cp -v /etc/passwd .
« /etc/passwd » -> « ./passwd »
Copier tout en préservant les attributs des fichiers
Lorsqu'on copie un fichier, par défaut, ce dernier perd ses attributs d'origine. Démonstration. Voici ci-dessous un fichier nommé « passwd.txt » qui possède certains attributs (utilisateur, groupe, taille, et heure de dernière modification).
$ ls -l /home/rkusnik/passwd.txt
-rw-r--r-- 1 rkusnik rkusnik 5760 21 avril 19:56 /home/rkusnik/passwd.txt
On peut observer ci-dessus que ce fichier appartient à l'utilisateur rkusnik et qu'il possède une certaine date précise concernant sa dernière modification (21 avril 19:56). L'utilisateur renata va copier maintenant ce fichier :
cp /home/rkusnik/passwd.txt passwd2.txt
Regardons ensemble les attributs du nouveau fichier :
$ ls -l passwd2.txt
-rw-r--r-- 1 renata renata 5760 21 avril 20:22 passwd2.txt
Comme on peut le constater, les attributs du fichier copié sont différents du fichier d'origine.
Afin de préserver les attributs il est nécessaire d'utiliser l'option « -p » comme ci-dessous :
cp -p /home/rkusnik/passwd.txt passwd2.txt
Copier en écrasant sans demande de confirmation
L'option -f ( --force), permet de forcer la copie. Si un fichier de destination existe déjà alors ce dernier sera directement écrasé sans avertissement (sans demande de confirmation). Ci-dessous voici un exemple d'utilisation dans lequel nous écrasons le fichier de destination déjà existant.
Si le fichier de destination (fic2) existe déjà, la commande cp l'écrase, sans poser de question.
Copier sans écraser les fichiers cibles éventuellement déjà existants
Lorsqu'on copie, il peut être lorsqu'on copie des fichiers dans un répertoire de ce préoccuper de ce qui va être écrasé ou non. Si vous souhaitez copier des fichiers sans écraser ceux qui pourraient éventuellement déjà exister, la commande cp dispose de l'option -n ( --no-clobber).
Si le fichier de destination « /etc/passwd » existe déjà alors ce dernier sera conservé.
Ecraser le fichier cible de destination uniquement si le fichier source est plus récent
Il peut être utile lors d'une mise à jour d'écraser uniquement les fichiers cibles plus anciens que les fichiers source.
Dans l'exemple ci-dessous nous copions le fichier ‘fica' vers ‘ficb'.
Copie et écrase le fichier cible « ficb » uniquement si « fica » est plus récent.
Créer un lien en dur d'un fichier (au lieu de le copier)
Lorsque vous exécutez la commande cp, il est possible de créer un lien en dur d'un fichier (au lieu de le copier). Dans l'exemple suivant un lien en dur du fichier file.c est créé dans le répertoire test.
$ ls -li
8520299 -rw-r--r-- 1 romain romain 0 24 oct. 2014 file.c
$ cp -l file.c test/
$ ls -li test/file.c
8520299 -rw-r--r-- 2 romain romain 0 24 oct. 2014 test/file.c
Créer le lien symbolique d'un fichier (au lieu de le copier)
Lorsque vous exécutez la commande cp, il est possible de créer le lien symbolique d'un fichier (au lieu de le copier). Dans l'exemple suivant un lien symbolique libXv.so du fichier libXv.so.1.0.0 est créé.
# ls -l libXv.so.1.0.0
-rwxr-xr-x 1 root root 18776 13 sept. 2013 libXv.so.1.0.0
# cp -s libXv.so.1.0.0 libXv.so
# ls -l libXv.so
lrwxrwxrwx 1 root root 14 13 sept. 2013 libXv.so -> libXv.so.1.0.0
Afficher l'aide mémoire de la commande cp
Pour afficher l'aide mémoire de la commande cp, il vous suffira de taper la commande suivante :
Faire une copie véritable
Afin de copier en gardant les attributs des fichiers et les liens symbolique récusivement
cp /usr/* /usr.tmp/ -rdvp
Utiliser rsync
Cette explication condensée provient des sources suivantes :
https://doc.ubuntu-fr.org/rsync et
https://debian-facile.org/doc:reseau:rsync
rsync est un outil qui permet de sauvegarder par copies vos données.
Il copie tous les fichiers sources vers la destination que vous avez choisie.
Ensuite, il ne mettra à jour que ceux qui ont été modifiés ou ajoutés. D'où un gain de temps.
De plus, rsync peut aussi être utilisé à travers un réseau.
Syntaxe de base
rsync [option] /source /destination
Deux-trois exemples :
Copie intégralement le fichier ou le répertoire source et son contenu vers destination
rsync -av /source /destination
Copie seulement le contenu du répertoire source dans destination
rsync -av /source/ /destination
Copie les fichiers avec leurs dossiers en préservant leurs propriétés respectives.
En root bien sûr :
rsync -r -avz /source/ /destination
Pour une gestion du port ssh, utiliser la syntaxe suivante:
rsync -avz chemin/source/ -e "ssh -p port" user@ip:"/chemin/de destination avec espaces/"
ou
rsync -avz -e "ssh -p port" user@ip:chemin/source/ "/chemin/de destination avec espaces/"
reprise d'un transfert
Lors d'un téléchargement distant par ssh, en cas de coupure, reprendre le transfert avec la commande :
rsync --partial --progress --rsh=ssh [source] [user]@[host]:[destination]
Exemple:
rsync --partial --progress --rsh=ssh fichier nom_user@hostName:/repertoire_receveur/
Les options :
- -partial relance le téléchargement depuis le point d’arrêt
- -progress affiche la progression du transfert
- -rsh=ssh sécurise le transfert
OPTIONS ACTION
- r visite récursive des répertoires
- l copie les liens symboliques comme liens symboliques
- p préserve les permissions
- t préserve les dates
- g préserve le groupe
- o préserve le propriétaire (root uniquement)
- D préserve les périphériques (root uniquement)
- a mode archivage; identique à -rlptgoD (pas -H)
- v De nombreuses informations sont affichées lors du transfert.
- z Compresse le fichier pour un meilleur transfert par le reseau.
- –delete ATTENTION ! Si le fichier (ou son contenu) n'existe plus dans “source”, il sera supprimé dans “destination”.
Il est tout à fait possible de créer des scripts pour automatiser le processus de sauvegarde.
Exemple de sauvegarde de son répertoire utilisateur vers un disque externe
rsync -r -t -x -v -n --progress -l -s --filter "- /.cache/" --filter "- /.thumbnails/" --filter "+ jeVeuxCeluiCi.txt" /home/utilisateur/ /media/DisqueExterne/repertoire_sauvegarde/ | more
- S traite les fichiers à trous efficacement
- x ne traverse pas les limites du système de fichiers
- n simule la sauvegarde sans ne rien faire réellement
- -progress affiche la progression
- -filter permet de désigner les dossiers que l'on ne veut pas sauvegarder (signe -) ou que l'on veut ajouter à la liste (signe +)
Le fait d'ajouter |more à la fin de la commande permet de faire défiler manuellement et de voir se qui va se passer en appuyant sur la touche espace
Une fois que vous avez vu le résultat de la commande et que cela vous va, enlevez -n et | more et appuyez sur entrée, la sauvegarde se fait pour de vrai. 8-)
rsync -r -t -x -v --progress -l -s --filter "- /.cache/" --filter "- /.thumbnails/" /home/utilisateur/ /media/DisqueExterne/repertoire_sauvegarde/