Linux / Commande rm : supprimer des fichiers et dossiers sans erreur de cible
La commande GNU rm retire les chemins de fichiers indiqués, sans passer par la corbeille habituelle du bureau. Elle ne supprime pas un dossier par défaut ; -r étend l’opération à son contenu, et -f supprime les demandes de confirmation. Avant une suppression, vérifiez donc le chemin exact et ce que le shell a réellement développé.
Les exercices ci-dessous créent puis retirent uniquement des fichiers ordinaires dans un nouveau dossier temporaire sous votre compte. Ils n’utilisent ni sudo ni rm -rf. Les options sont celles de GNU Coreutils rm ; consultez rm --help ou man rm sur la machine cible lorsque sa version ou sa distribution diffère.
Que supprime rm, et peut-on récupérer le fichier ?
rm retire une entrée de répertoire, c’est-à-dire un nom qui permet d’atteindre un fichier. Si d’autres liens physiques existent, le même contenu reste accessible par eux. Un processus qui tient déjà un fichier ouvert peut aussi continuer à l’utiliser temporairement selon le système. Cela ne constitue pas une méthode de récupération fiable : les blocs peuvent ensuite être réutilisés, et la récupération dépend du système de fichiers, des instantanés et des sauvegardes.
Un rm ordinaire ne déplace pas le fichier dans la corbeille du bureau. Si vous avez besoin d’un retour simple, utilisez un outil de corbeille adapté ou déplacez d’abord les fichiers vers un emplacement de quarantaine contrôlé. Pour des données importantes, confirmez qu’une sauvegarde a réellement été restaurée lors d’un test avant de supprimer l’original. rm n’est pas non plus une garantie d’effacement sécurisé des données sur le support.
Syntaxe et options à connaître avant d’agir
rm [OPTION]... [FICHIER]...
| Option | Effet | Précaution |
|---|---|---|
-r, -R |
Descend récursivement dans un dossier et retire son contenu. | Vérifiez l’arborescence et les montages avant de l’utiliser. |
-i |
Demande confirmation pour chaque élément. | Une réponse négative laisse l’élément en place ; ce n’est pas un contrôle de chemin. |
-I |
Demande une fois confirmation pour plus de trois fichiers ou une suppression récursive. | Un seul accord peut ensuite couvrir beaucoup de fichiers. |
-f |
Ignore les chemins absents et ne demande pas confirmation. | N’effacez pas les erreurs de ciblage en l’ajoutant systématiquement. |
-d |
Permet de retirer un dossier vide nommé explicitement. | rmdir est souvent plus clair pour les dossiers vides. |
-v |
Affiche les chemins retirés. | Le journal aide à examiner une opération, mais ne l’annule pas. |
--one-file-system |
Lors d’une suppression récursive, évite de descendre dans un dossier monté sur un autre système de fichiers que l’argument. | N’arrête pas une suppression sur le même système de fichiers et ne remplace pas l’inspection des montages. |
--preserve-root[=all] |
Protège / lors d’une suppression récursive ; =all rejette aussi certains arguments qui sont une racine de système de fichiers distincte. |
La protection de / est déjà le comportement GNU par défaut ; elle ne protège pas vos autres dossiers. |
Pour un nom de fichier commençant par un tiret, placez -- avant les opérandes, par exemple rm -- -rapport.txt, ou utilisez un chemin qui commence par ./. Mettez entre guillemets les chemins contenant des espaces. Ne citez pas un motif glob si vous voulez l’expansion du shell ; examinez d’abord cette expansion, et évitez les motifs larges pour les données importantes.
Supprimer un fichier que l’on vient de créer et vérifier le résultat
Ce premier exercice crée un dossier réservé à la pratique, y écrit un seul fichier, affiche le chemin précis, le retire sans option récursive, puis teste son absence. Le chemin de lab est aléatoire afin de ne pas réutiliser un ancien dossier.
lab=$(mktemp -d "$HOME/rm-lab.XXXXXX") || exit 1
printf 'exercice\n' > "$lab/disposable.txt"
printf 'Cible : %s\n' "$lab/disposable.txt"
ls -ld -- "$lab/disposable.txt"
rm -- "$lab/disposable.txt"
if test ! -e "$lab/disposable.txt"; then
printf 'Fichier absent après rm\n'
fi
La dernière ligne doit afficher « Fichier absent après rm ». Le code de sortie 0 de rm indique que la commande a terminé sans erreur détectée, pas qu’une sauvegarde ou une restauration est disponible. Pour vérifier un fichier symbolique cassé, test -e seul ne suffit pas : test -L peut montrer que le lien lui-même existe encore.
Contrôler un glob et une variable avant une suppression
Un motif comme *.tmp est développé par le shell avant que rm ne s’exécute. Créez deux fichiers de pratique, affichez la liste des chemins que le motif sélectionne, puis ne retirez que ces deux fichiers à l’intérieur du dossier connu :
printf 'a\n' > "$lab/a.tmp"
printf 'b\n' > "$lab/b.tmp"
printf 'Fichiers prévus :\n'
printf '%s\n' "$lab"/*.tmp
rm -- "$lab"/*.tmp
find "$lab" -maxdepth 1 -type f -print
La prévisualisation doit citer exactement a.tmp et b.tmp dans votre dossier de pratique, et la dernière commande ne doit plus afficher de fichier ordinaire à ce niveau. Si aucun fichier ne correspond, certains shells laissent le motif littéral et d’autres le traitent différemment. Dans un script, vérifiez donc la liste réelle et le code de sortie au lieu de supposer que le motif a été développé. Les noms contenant des retours à la ligne rendent l’affichage par lignes ambigu ; pour un traitement automatisé, utilisez une méthode à séparateur nul comme find -print0 avec un consommateur compatible.
Pour un chemin construit avec une variable, testez qu’elle n’est pas vide, qu’elle pointe vers le dossier attendu et que ce dossier n’est pas un lien symbolique vers une autre arborescence. Les guillemets autour de "$target" empêchent un découpage inattendu en plusieurs arguments, mais ne valident ni la valeur ni sa portée. Comparez le chemin résolu à une racine autorisée avant toute suppression automatisée ; la simple présence du texte /safe/ dans un chemin n’est pas une preuve suffisante.
Retirer un petit dossier connu sans élargir la portée
La commande rmdir retire seulement un dossier vide ; elle est donc adaptée lorsque du contenu restant doit faire échouer l’opération. GNU rm -d a aussi cette capacité. Pour une arborescence non vide, rm -r est explicite, mais vérifiez d’abord son contenu, ses montages et sa sauvegarde. L’exercice suivant construit une seule sous-arborescence sous lab, l’inspecte, puis la retire :
mkdir -p -- "$lab/cache/old"
printf 'jetable\n' > "$lab/cache/old/item.txt"
find "$lab/cache" -maxdepth 3 -print
test -d "$lab/cache" && test ! -L "$lab/cache" || exit 1
rm -r -- "$lab/cache"
test ! -e "$lab/cache" && printf 'Dossier de pratique retiré\n'
Avant rm, find doit montrer uniquement cache, old et item.txt dans le dossier de pratique. Le contrôle test ! -L évite de traiter le nom de la cible comme un simple pointeur, mais ne constitue pas une protection générale contre les changements concurrents entre vérification et suppression. Dans un emplacement partagé, retirez l’accès en écriture aux autres acteurs ou utilisez une procédure de quarantaine et de revue adaptée.
Sur un arbre de production contenant un montage, --one-file-system peut empêcher rm -r de descendre dans un sous-dossier monté sur un autre système de fichiers. Il ne protège pas un dossier monté sur le même système de fichiers et n’efface pas le risque d’avoir choisi le mauvais argument de départ. Consultez d’abord findmnt --target CHEMIN ou l’outil de montages de votre système, sans lancer de suppression pendant cette inspection.
Choisir confirmation, corbeille ou sauvegarde selon le cas
Pour quelques fichiers choisis à la main, rm -i -- FICHIER demande avant chaque retrait. Pour une opération récursive ou plus de trois noms, rm -I -- ... demande une seule fois. Dans un script non interactif, ces invites peuvent bloquer ou être contournées selon l’entrée standard : posez plutôt des conditions explicites sur les chemins, le propriétaire du dossier et le nombre d’objets visés, puis gardez un journal.
Une alias comme alias rm='rm -i' dépend de la session et n’est pas une politique de sécurité pour les scripts. Un outil de corbeille laisse une possibilité de restauration dans un environnement de bureau, mais dépend de sa configuration et de son stockage. Pour des données importantes, préférez une sauvegarde vérifiée ou un déplacement vers une quarantaine datée avec une politique de rétention. N’utilisez pas shred comme promesse universelle d’effacement : copies, instantanés, systèmes de fichiers journalisés et supports flash changent le résultat possible.
Questions fréquentes
Un fichier retiré par rm va-t-il dans la corbeille ?
Habituellement non. GNU rm retire le nom du système de fichiers ; ne comptez pas sur une restauration par la corbeille du bureau.
Quelle commande choisir pour un dossier vide ?
rmdir CHEMIN échoue si le dossier n’est pas vide. Avec GNU rm, -d retire aussi un dossier vide nommé explicitement.
Quelle différence entre rm -i et rm -I ?
-i demande une réponse pour chaque élément ; -I demande une fois pour plus de trois fichiers ou une suppression récursive. Aucune de ces options ne vérifie que la cible prévue est la bonne.
Peut-on toujours récupérer un fichier supprimé par erreur ?
Non. La possibilité dépend notamment des sauvegardes, instantanés, écritures suivantes et du système de fichiers. Réduisez les nouvelles écritures et suivez la procédure de récupération adaptée au support.
La référence des commandes Linux par tâche aide à comparer rm aux autres opérations sur les fichiers.




