Linux / Commande mv : déplacer et renommer des fichiers sans écrasement imprévu

La commande GNU mv déplace ou renomme des fichiers et des dossiers. Sur un même système de fichiers, elle utilise normalement un renommage ; vers un autre système de fichiers, GNU mv peut copier les données puis retirer la source après la copie. Vérifiez surtout si la destination est déjà un dossier et si un fichier du même nom y existe : cela change le chemin final et le risque d’écrasement.

Les exercices utilisent de petits fichiers nouvellement créés dans un dossier de pratique, sans privilèges. Le manuel officiel GNU Coreutils pour mv précise les options et le comportement entre systèmes de fichiers ; contrôlez votre version avec mv --help ou man mv.

Comment mv interprète-t-il la destination ?

mv [OPTION]... SOURCE DESTINATION
mv [OPTION]... SOURCE... RÉPERTOIRE
mv [OPTION]... -t RÉPERTOIRE SOURCE...

Avec deux chemins, si DESTINATION est un dossier existant, la source est placée dans ce dossier sous son nom courant. Sinon, le dernier argument devient le nouveau nom du fichier ou du dossier. Avec plusieurs sources, le dernier argument doit désigner un dossier. L’option GNU -t met ce dossier avant les sources ; -T demande au contraire de traiter le dernier argument comme un chemin exact, même s’il ressemble à un dossier cible.

Mettez entre guillemets les noms contenant des espaces et utilisez -- pour séparer les options des chemins commençant par un tiret. Avant un déplacement important, affichez ls -ld -- SOURCE DESTINATION et vérifiez les deux chemins résolus, leur propriétaire, l’espace disponible et les éventuels montages. Un échec de ls pour une destination nouvelle est normal ; assurez-vous alors que son parent est le bon dossier.

Renommer un fichier et vérifier les chemins

Le premier bloc crée un dossier de pratique distinct sous votre compte, puis un fichier brouillon.txt. Il le renomme dans le même dossier et vérifie que l’ancien nom a disparu et que le nouveau contient la donnée attendue.

lab=$(mktemp -d "$HOME/mv-lab.XXXXXX") || exit 1
printf 'version de travail\n' > "$lab/brouillon.txt"
mv -- "$lab/brouillon.txt" "$lab/final.txt"
test ! -e "$lab/brouillon.txt" && test -f "$lab/final.txt"
cat -- "$lab/final.txt"

Le résultat doit être « version de travail ». Si test échoue, n’enchaînez pas automatiquement avec la suite : listez les deux noms et lisez le message d’erreur de mv. Un mv réussi ne produit généralement aucun texte sans -v ; son code de sortie et l’état des chemins comptent davantage.

Déplacer plusieurs fichiers dans un dossier connu

Ce bloc crée un dossier archive et deux petits journaux de pratique. L’option -t rend le dossier de destination explicite avant la liste des sources, ce qui aide à relire un script :

mkdir -- "$lab/archive"
printf 'a\n' > "$lab/app.log"
printf 'b\n' > "$lab/access.log"
mv -t "$lab/archive" -- "$lab/app.log" "$lab/access.log"
find "$lab/archive" -maxdepth 1 -type f -print
test ! -e "$lab/app.log" && test ! -e "$lab/access.log"

find doit afficher app.log et access.log sous archive. Si vous préférez un motif comme "$lab"/*.log, prévisualisez d’abord l’expansion avec printf '%s\n' "$lab"/*.log : le shell peut traiter différemment un motif sans correspondance, et des noms inattendus peuvent élargir l’opération. Pour des noms avec retours à la ligne ou une liste issue de find, préférez une procédure à séparateur nul et un contrôle du nombre d’éléments.

Éviter l’écrasement et conserver un retour possible

Option GNU Comportement utile Limite à connaître
-i Demande confirmation avant de remplacer une destination existante. Dépend d’une réponse interactive ; vérifiez le résultat après la réponse.
-n, --no-clobber Saute silencieusement une destination déjà présente. Ne prouve pas qu’un fichier a été déplacé ; GNU considère maintenant cette option comme dépréciée à cause de différences de code de sortie entre plateformes.
--update=none-fail Ne remplace pas une destination existante et signale l’élément sauté comme un échec. Extension GNU à vérifier sur la version cible.
-f Ne demande pas confirmation avant le remplacement. Peut retirer la destination antérieure sans copie de secours.
-b, --backup Crée une sauvegarde de chaque destination qui serait remplacée. Examinez la méthode et le nom de sauvegarde ; incompatible avec -n.
-u Ne remplace en général une destination que si la source est plus récente. Les horodatages ne disent pas si les contenus sont identiques.
-T Traite la destination comme un chemin précis, pas comme un dossier recevant la source. Ne doit pas être appliqué à un vrai dossier sans comprendre le conflit possible.

Si -i, -f et -n apparaissent ensemble, GNU mv applique la dernière de ces options. Pour une automatisation où un fichier déjà présent doit faire échouer la tâche, --update=none-fail est plus explicite que -n sur une version qui le prend en charge. Le code de sortie de -n ou --update=none peut signaler une commande réussie alors que la source n’a pas bougé ; contrôlez donc les deux chemins.

L’exercice suivant crée exprès une destination existante dans le dossier de pratique et vérifie que --update=none-fail la laisse intacte. Il capture le code de sortie au lieu d’arrêter le shell sur cet échec attendu :

printf 'nouvelle version\n' > "$lab/source.conf"
printf 'ancienne version\n' > "$lab/destination.conf"
if mv --update=none-fail -- "$lab/source.conf" "$lab/destination.conf"; then
  printf 'Déplacement inattendu : contrôler les fichiers\n' >&2
else
  printf 'Destination protégée\n'
fi
cat -- "$lab/source.conf" "$lab/destination.conf"

La source et la destination doivent encore exister et contenir respectivement « nouvelle version » et « ancienne version ». Cette vérification est préférable à la seule inspection du message. Avant un remplacement réel, sauvegardez le fichier qui sera écrasé et prévoyez une restauration de son contenu et de ses attributs. Ne supposez pas que -b couvre à lui seul l’ensemble d’un déploiement à plusieurs fichiers.

Que change un déplacement vers un autre système de fichiers ?

Quand le renommage entre les deux systèmes de fichiers échoue pour cette raison, GNU mv retombe sur une copie proche de cp -a, puis retire la source si la copie réussit. Pour plusieurs sources, une erreur au milieu peut laisser certaines données à destination et d’autres à l’origine. Une grosse opération peut donc prendre du temps, manquer d’espace ou être interrompue. Elle n’est pas équivalente à un simple changement de nom atomique.

Avant l’opération, vérifiez les systèmes de fichiers et l’espace avec df -T -- SOURCE DESTINATION lorsque les deux chemins existent, ainsi que les montages de leurs parents. Pour un déplacement sensible, copiez d’abord avec un outil adapté, comparez le nombre de fichiers, les tailles, les contenus et les attributs nécessaires, puis retirez les originaux seulement après validation. GNU mv essaie de copier les attributs étendus, mais le manuel précise que certains avertissements liés à ces attributs ne changent pas le code de sortie : lisez aussi les avertissements et vérifiez ACL, contexte SELinux ou capacités lorsque ces attributs comptent.

L’option GNU --no-copy fait échouer mv si le renommage n’est pas possible parce que la destination est sur un autre système de fichiers. Elle sert quand vous avez besoin de refuser le repli en copie ; elle ne transforme pas un déplacement interdisque en opération instantanée. Une source qui est un lien symbolique vers un dossier ne doit pas recevoir par réflexe une barre oblique finale : suivant le système, cela peut modifier l’objet visé.

Quand employer mv, cp ou un outil de synchronisation ?

Choisissez mv si vous voulez que l’ancien chemin disparaisse après un déplacement réussi. Utilisez cp quand la source et la copie doivent rester disponibles indépendamment. Pour de gros ensembles ou un transfert distant, un outil comme rsync offre des contrôles et une reprise plus détaillés ; son option --remove-source-files vise les fichiers transférés et ne nettoie pas à elle seule les répertoires vides. Quelle que soit la méthode, vérifiez la destination avant d’effacer la source ou la sauvegarde.

Pour un nom de destination qui pourrait désigner un dossier existant, mv -T -- SOURCE DESTINATION exprime le chemin exact dans GNU mv. Testez d’abord cette intention dans un dossier de pratique. Un dossier de destination non vide ne sera pas remplacé comme un fichier ordinaire ; l’échec doit conduire à examiner les deux arborescences plutôt qu’à ajouter -f sans diagnostic.

Questions fréquentes

mv recopie-t-il toujours les données ?

Non. Un déplacement sur le même système de fichiers est normalement un renommage. Si la destination est sur un autre système de fichiers, GNU mv peut copier puis retirer la source après réussite de la copie.

Comment éviter de remplacer un fichier existant ?

-i demande confirmation ; -n saute silencieusement. Avec une version GNU qui le prend en charge, --update=none-fail signale également le saut comme un échec, ce qui facilite la vérification dans un script.

Pourquoi le fichier est-il entré dans un dossier au lieu d’être renommé ?

Avec deux arguments, GNU mv interprète une destination qui est déjà un dossier comme un dossier recevant la source. Vérifiez son type ou utilisez -T pour demander un chemin exact lorsque c’est votre intention.

Un code de sortie nul suffit-il à confirmer qu’un fichier a bougé avec -n ?

Non. Si la destination existait, -n peut sauter la source silencieusement. Inspectez l’ancien et le nouveau chemin et le contenu attendu.

La référence des commandes Linux par tâche situe mv parmi les opérations de fichiers.