Linux / Commande cp : copier des fichiers et dossiers en contrôlant les attributs
La commande GNU cp copie un fichier ou, avec une option récursive, un dossier vers un autre chemin. La copie garde un contenu indépendant de la source : modifier l’un des fichiers ne modifie pas automatiquement l’autre. Pour éviter un résultat surprenant, vérifiez d’abord si la destination est déjà un dossier et choisissez séparément les attributs à préserver.
Les exercices se déroulent dans un nouveau dossier de pratique sous votre compte et n’utilisent pas sudo. Le manuel officiel GNU Coreutils pour cp sert de référence pour les options ; sur une autre version, consultez cp --help et man cp.
Comment cp choisit-il le nom de la copie ?
cp [OPTION]... SOURCE DESTINATION
cp [OPTION]... SOURCE... RÉPERTOIRE
cp [OPTION]... -t RÉPERTOIRE SOURCE...
Avec deux arguments, une destination qui est un dossier existant reçoit la source sous son nom actuel. Si la destination n’est pas un dossier, elle devient le nom de la copie. Avec plusieurs sources, le dernier argument doit être un dossier, ou utilisez -t RÉPERTOIRE pour placer le dossier avant la liste. GNU -T force l’interprétation du dernier argument comme chemin exact : examinez les chemins avant de l’employer contre une destination qui existe.
Entourez de guillemets les noms contenant des espaces et placez -- avant les chemins susceptibles de commencer par un tiret. Une copie simple peut remplacer un fichier destination existant ; pour des données importantes, listez d’abord la source, la destination et son parent, puis préparez une sauvegarde distincte. cp ne signale normalement pas sa réussite par du texte sans -v.
Copier un fichier et vérifier que les deux contenus sont indépendants
Ce bloc réserve un dossier temporaire, crée un fichier ordinaire et sa copie, puis vérifie que leurs octets sont identiques. Il modifie ensuite uniquement la copie pour montrer que la source garde son ancien contenu :
lab=$(mktemp -d "$HOME/cp-lab.XXXXXX") || exit 1
printf 'version source\n' > "$lab/source.txt"
cp -- "$lab/source.txt" "$lab/copie.txt"
cmp -- "$lab/source.txt" "$lab/copie.txt"
printf 'version copie\n' > "$lab/copie.txt"
cat -- "$lab/source.txt" "$lab/copie.txt"
cmp ne doit afficher aucune différence avant la modification. Les deux dernières lignes de résultat doivent être « version source » puis « version copie ». Le simple fait de voir un nouveau nom ne suffit pas pour un transfert important : comparez le contenu avec cmp ou une somme de contrôle, puis vérifiez aussi les attributs dont vous avez besoin. La comparaison n’est fiable que si la source reste stable pendant l’opération.
Copier un dossier : -R ou -a ?
-R parcourt les sous-dossiers et copie leurs éléments. -a, ou --archive, ajoute la préservation de la structure des liens et du plus grand nombre possible d’attributs, tels que les modes, propriétaires et horodatages. Le manuel GNU l’assimile à -dR --preserve=all avec des diagnostics réduits pour certains échecs de préservation. Cela ne garantit pas une sauvegarde d’application cohérente.
Pour distinguer les résultats et inclure les fichiers cachés, créez une arborescence de pratique, puis copiez le dossier complet sous deux nouveaux noms. Aucune destination ne préexiste dans ce bloc :
mkdir -p -- "$lab/projet/config"
printf 'PORT=8080\n' > "$lab/projet/config/app.conf"
printf 'caché\n' > "$lab/projet/.secret-demo"
cp -R -- "$lab/projet" "$lab/projet-recursif"
cp -a -- "$lab/projet" "$lab/projet-archive"
find "$lab/projet-archive" -maxdepth 2 -type f -print
cmp -- "$lab/projet/config/app.conf" "$lab/projet-archive/config/app.conf"
cmp -- "$lab/projet/.secret-demo" "$lab/projet-archive/.secret-demo"
find doit afficher config/app.conf et .secret-demo sous la copie d’archive ; les deux comparaisons ne doivent signaler aucune différence. Le glob "$lab/projet"/* aurait normalement omis le fichier commençant par un point. Pour copier le contenu d’un dossier dans un dossier existant plutôt que de créer un sous-dossier du même nom, vérifiez la forme de la commande dans le dossier de pratique, par exemple avec cp -a -- "$lab/projet/." "$lab/dossier-existant/" après avoir créé cette destination. La notation /. inclut aussi les entrées cachées.
Sur GNU cp, la copie récursive ne suit généralement pas les liens symboliques rencontrés dans l’arbre ; une copie non récursive d’un lien source suit généralement sa cible. -a demande de préserver les liens comme liens. Les options -L, -P et -H changent quelles cibles sont suivies ; testez-les dans un dossier sans données importantes avant de copier un arbre contenant des liens vers l’extérieur. Le résultat d’une copie de liens peut varier sur d’autres systèmes Unix.
Quelles options protègent la destination et ses attributs ?
| Option GNU | Rôle | Vérification nécessaire |
|---|---|---|
-R, -r |
Copie récursivement un dossier. | Sur des systèmes non GNU, -r peut différer pour les liens et fichiers spéciaux ; préférez une option adaptée à la plateforme. |
-a |
Copie récursivement en essayant de préserver liens et attributs. | Contrôlez ACL, attributs étendus et contexte de sécurité ; certains échecs ne changent pas le code de sortie. |
-p |
Préserve si possible mode, propriétaire et horodatages. | Le propriétaire peut exiger des privilèges. |
-i |
Demande confirmation avant d’écraser un fichier. | Examinez quand même la destination après la réponse. |
-n |
Saute silencieusement un fichier déjà présent. | Option dépréciée dans le manuel GNU actuel pour des différences de code de sortie entre plateformes. |
--update=none-fail |
Refuse le remplacement et signale comme échec la copie sautée. | Vérifiez la prise en charge sur la version cible. |
-u |
Ne remplace en général que si la source est plus récente que la destination. | Un horodatage n’est pas une preuve d’égalité du contenu. |
-t DIR, -T |
Fixent respectivement le dossier de destination ou le chemin exact. | Ne les confondez pas : elles définissent des formes d’opération différentes. |
--reflink=always, --reflink=auto |
Demandent une copie à partage de blocs selon le système de fichiers ; auto permet un repli en copie ordinaire. |
Le partage initial des blocs ne remplace pas une sauvegarde indépendante contre une défaillance du support. |
Sur une version GNU qui propose --update=none-fail, cette option est utile si une destination déjà présente doit faire échouer un script, plutôt que d’être sautée sans signal clair. Les options -i, -n et -u ne résolvent pas une mauvaise sélection des chemins ; vérifiez la source et la destination avant la copie. Pour choisir exactement les attributs à préserver, utilisez --preserve=mode,ownership,timestamps ou les attributs requis après avoir vérifié leur prise en charge et les privilèges nécessaires.
Vérifier une copie importante avant de l’utiliser
Pour un fichier stable, cmp -- SOURCE DESTINATION retourne 0 si les octets sont identiques ; sha256sum permet de conserver une empreinte vérifiable. Pour deux arborescences de texte ou de fichiers ordinaires, diff -qr -- SOURCE DESTINATION signale les noms manquants et les contenus différents, mais ne compare pas tous les attributs. Lisez les codes de sortie et les diagnostics ; des permissions insuffisantes ou une source qui change pendant l’inspection peuvent rendre le contrôle incomplet.
Si les permissions, propriétaires, dates, ACL, attributs étendus ou contextes SELinux sont importants, comparez-les avec les outils appropriés sur les deux côtés. stat montre notamment mode, propriétaire et dates ; un contrôle de contenu seul n’est pas suffisant. Une sauvegarde de base de données ou de service en cours d’écriture demande une procédure propre à l’application, éventuellement avec instantané cohérent et restauration testée. cp -a ne fige pas les écritures pendant sa lecture.
Pour un grand arbre ou des copies répétées, rsync peut limiter les transferts et fournir des options de reprise et de sélection. Choisissez mv si l’ancien chemin doit disparaître après réussite, et install si vous déployez un fichier en définissant son mode et, si possible, son propriétaire. Le guide de la commande mv détaille la différence entre renommage local et copie entre systèmes de fichiers ; le guide de la commande install montre comment fixer les droits à la destination.
Questions fréquentes
Faut-il -R ou -a pour copier un dossier ?
-R suffit pour parcourir un dossier. Choisissez -a si vous devez aussi essayer de conserver les liens et les attributs ; vérifiez ensuite ceux qui comptent.
La copie créée par cp est-elle toujours indépendante ?
Le fichier logique copié est indépendant : une écriture sur l’un ne change pas automatiquement l’autre. Avec une copie à partage de blocs, les données physiques peuvent toutefois rester partagées jusqu’à une modification, ce qui limite la protection contre une panne du support.
Comment empêcher l’écrasement d’une destination existante ?
-i demande confirmation, -n saute la copie et --update=none-fail peut signaler ce saut comme un échec dans GNU cp. Vérifiez la version et le résultat réel.
Pourquoi un fichier caché manque-t-il dans la copie ?
Un motif shell comme source/* omet normalement les noms commençant par un point. Copier le dossier lui-même ou son contenu avec une notation contrôlée comme source/. peut les inclure.
La référence des commandes Linux par tâche compare cp aux autres outils de fichiers.




