Commandes Linux : cp

CP

Installé avec le paquet coreutils
Voir aussi : mv

 

Afficher la version de la commande cp

cp --version

ou

apt-cache policy coreutils

 

Remarques sur l’alias cp

Attention, sur la plupart des distribution, il existe l’alias suivant :

alias cp='cp -i'

Donc une demande de confirmation apparaitra systématiquement demandant si l’on souhaite écraser le fichier/dossier de même nom sur la destination.
Pour pallier ce problème, il faut appeler directement l’exécutable cp (donc sans alias) par son chemin absolu ou supprimer/commenter l’alias dans le fichier ~/.bashrc :

# cp source.txt destination/
cp : voulez-vous écraser « destination/source.txt » ? o

=> Provoque une demande de confirmation si destination/source.txt existe déjà.

# /bin/cp source.txt destination/

ou

# yes | cp source.txt destination/

=> Ecrase destination/source.txt s’il existe déjà.

 

Copier un fichier dans un dossier

cp fichier dossier/ 

 

Copier un fichier en renommant la copie

cp filename newfilename 

ex :

# cp file1.txt newfile1.txt

Copie dans le répertoire courant.

# cp file1.txt /destination/file1.txt

Copie dans une répertoire différent.

 

Copier récursivement une arborescence de fichiers et dossiers

cp -a /path/source/ /path/destination/

ou, en mode verbeux :

cp -av /path/source/ /path/destination/

Si le répertoire destination existe, le dossier source et son contenu seront copiés à l’intérieur.

# tree destination/
destination/
└── source
    ├── file1.txt
    └── file2.txt

1 directory, 2 files

Si le répertoire destination n’existe pas, le dossier source sera copié sous le nom destination.

# tree destination/
destination/
├── file1.txt
└── file2.txt

0 directories, 2 files

 

Copier récursivement les fichiers ou dossiers visibles et cachés

cp -a /path/source/. /path/destination/

ex :

# ls -lA source
-rw-r--r-- 1 root root 0 nov.  29 12:28 .file1.txt
-rw-r--r-- 1 root root 0 nov.  29 12:28 .file2.txt
-rw-r--r-- 1 root root 0 nov.  29 12:28 file3.txt
-rw-r--r-- 1 root root 0 nov.  29 12:28 file4.txt
# cp -a source/. destination/
# ls -lA destination/
-rw-r--r-- 1 root root 0 nov.  29 12:28 .file1.txt
-rw-r--r-- 1 root root 0 nov.  29 12:28 .file2.txt
-rw-r--r-- 1 root root 0 nov.  29 12:28 file3.txt
-rw-r--r-- 1 root root 0 nov.  29 12:28 file4.txt

Le “.” permet de prendre en compte les fichiers cachés et visibles lors de la copie, contrairement à “*” qui ne considère que les fichiers visibles :

# ls -lA source
-rw-r--r-- 1 root root 0 nov.  29 12:28 .file1.txt
-rw-r--r-- 1 root root 0 nov.  29 12:28 .file2.txt
-rw-r--r-- 1 root root 0 nov.  29 12:28 file3.txt
-rw-r--r-- 1 root root 0 nov.  29 12:28 file4.txt
# cp -a source/* destination/
# ls -lA destination/
-rw-r--r-- 1 root root 0 nov.  29 12:28 file3.txt
-rw-r--r-- 1 root root 0 nov.  29 12:28 file4.txt

 

Différences entre l’option -a et l’option -R

cp -a /path/source/ /path/destination/

est très différent de :

cp -R /path/source/ /path/destination/

L’option récursive -a est nettement à préférer :

  • préservation des propriétaires
  • préservation des permissions
  • préservation de l’horodatage
  • ne suit pas les liens, copie seulement le lien
  • ne copie pas les fichiers spéciaux

L’option récursive -R est à éviter :

  • l’utilisateur qui effectue la copie devient propriétaire
  • les permissions sont réinitialisées en fonction de l’umask
  • l’horodatage est celui du moment de la copie
  • suit les liens symboliques et donc peut copier des fichiers spéciaux pointés par un lien

Rmq : Les options -R et -r sont identiques.

cp -a
= cp -dR --preserve=all
= cp -dR --preserve=mode,ownership,timestamps,context,links,xattr
= cp --no-dereference --preserve=links -R --preserve=mode,ownership,timestamps,context,links,xattr
= cp --no-dereference --preserve=links --recursive --preserve=mode,ownership,timestamps,context,links,xattr

cp -a = cp --no-dereference --recursive --preserve=mode,ownership,timestamps,context,links,xattr

Proche de :
rsync -Hav /pathtoA/ /pathtoB/

 

Copier un fichier dans un dossier en demandant confirmation avant écrasement d’un fichier de même nom

cp -i fichier dossier/ 

ex :

# cp -i source/file1.txt destination/
cp : voulez-vous écraser « destination/file1.txt » ? o

 

Copier seulement les fichiers plus récents ou qui n’existent pas sur la destination

cp -au source/* destination/ 

Si le dossier source contient des fichiers de même nom et plus récents que sur destination, alors ils seront copiés.
De plus, les fichiers inexistants dans la destination seront copiés depuis la source.
Proche de :
rsync -Hauv //pathtoA/ /pathtoB/

 

Copier seulement les fichiers qui n’existent pas sur la destination

cp -an source/* destination/ 

Si le dossier source contient des fichiers de même nom que sur destination (quel que soit l’horodatage), ces derniers ne seront pas copiés.
Seuls les fichiers inexistants dans la destination seront copiés depuis la source.
Proche de :
rsync -Hav --ignore-existing //pathtoA/ /pathtoB/

 

Sauvegarder les fichiers écrasés

cp source/* destination/ --backup=t

Sauvegardera les fichiers écrasés en leur concaténant une extension numérotée.
ex :

# cp -v source/* destination/ --backup=t
« source/file1 » -> « destination/file1 » (archive : « destination/file1.~1~ »)
« source/file2 » -> « destination/file2 » (archive : « destination/file2.~1~ »)
« source/file3 » -> « destination/file3 » (archive : « destination/file3.~1~ »)
# ls -lA destination/
total 0
-rw-r--r-- 1 root root 0 déc.   4 02:19 file1
-rw-r--r-- 1 root root 0 déc.   4 02:11 file1.~1~
-rw-r--r-- 1 root root 0 déc.   4 02:19 file2
-rw-r--r-- 1 root root 0 déc.   4 02:11 file2.~1~
-rw-r--r-- 1 root root 0 déc.   4 02:19 file3
-rw-r--r-- 1 root root 0 déc.   4 02:11 file3.~1~
cp source/* destination/ --backup=simple

Sauvegardera les fichiers écrasés en laur concaténant un tilde final.
ex :

# cp -v source/* destination/ --backup=simple
« source/file1 » -> « destination/file1 » (archive : « destination/file1~ »)
« source/file2 » -> « destination/file2 » (archive : « destination/file2~ »)
« source/file3 » -> « destination/file3 » (archive : « destination/file3~ »)
# ls -lA destination/
total 0
-rw-r--r-- 1 root root 0 déc.   4 02:20 file1
-rw-r--r-- 1 root root 0 déc.   4 02:19 file1~
-rw-r--r-- 1 root root 0 déc.   4 02:20 file2
-rw-r--r-- 1 root root 0 déc.   4 02:19 file2~
-rw-r--r-- 1 root root 0 déc.   4 02:20 file3
-rw-r--r-- 1 root root 0 déc.   4 02:19 file3~

 

Sauvegarder les fichiers écrasés en ajoutant automatiquement l’extension .old

Ponctuellement :
cp -b -S .old source/* destination/

ex :

# cp -v -b -S .old source/* destination/
« source/file1 » -> « destination/file1 » (archive : « destination/file1.old »)
« source/file2 » -> « destination/file2 » (archive : « destination/file2.old »)
« source/file3 » -> « destination/file3 » (archive : « destination/file3.old »)
# ls -lA destination/
total 0
-rw-r--r-- 1 root root 0 déc.   4 02:22 file1
-rw-r--r-- 1 root root 0 déc.   4 02:20 file1.old
-rw-r--r-- 1 root root 0 déc.   4 02:22 file2
-rw-r--r-- 1 root root 0 déc.   4 02:20 file2.old
-rw-r--r-- 1 root root 0 déc.   4 02:22 file3
-rw-r--r-- 1 root root 0 déc.   4 02:20 file3.old
De manière permanente :

Il faut avant tout définir une variable d’environnement appelée SIMPLE_BACKUP_SUFFIX et lui affecter la valeur “.old”
Cette variable peut être définie, au niveau global, /etc/profile ou /etc/bash.bashrc ou, au niveau utilisateur, dans ~/.profile ou ~/.bashrc, en ajoutant la ligne suivante dans un de ces fichiers :

[...]
export SIMPLE_BACKUP_SUFFIX=".old"

Puis, pour qu’elle soit chargée dans la session courante :

# source /etc/bash.bashrc

ou

# . /etc/bash.bashrc

Dans le cas où la variable a été défnie dans le fichier /etc/bash.bashrc.
Vérification de la valeur affectée à la variable :

# echo $SIMPLE_BACKUP_SUFFIX
.old

Enfin, il est possible de lancer la commande cp en mode backup sans spécifier le suffixe utilisé puisqu’il est défini dans la variable :

cp -b source/* destination/

ex :

# cp -v -b source/* destination/
« source/file1 » -> « destination/file1 » (archive : « destination/file1.old »)
« source/file2 » -> « destination/file2 » (archive : « destination/file2.old »)
« source/file3 » -> « destination/file3 » (archive : « destination/file3.old »)
# ls -lA destination/
total 0
-rw-r--r-- 1 root root 0 déc.   4 02:25 file1
-rw-r--r-- 1 root root 0 déc.   4 02:22 file1.old
-rw-r--r-- 1 root root 0 déc.   4 02:25 file2
-rw-r--r-- 1 root root 0 déc.   4 02:22 file2.old
-rw-r--r-- 1 root root 0 déc.   4 02:25 file3
-rw-r--r-- 1 root root 0 déc.   4 02:22 file3.old
Fermer le menu
%d blogueurs aiment cette page :