Aller au contenu

Supprimer : rm et rmdir

Objectif : prise en main des opérations de suppression de fichiers et de répertoires.

Gare aux armes de destruction massive

La commande rm (comme remove) sert à supprimer des fichiers et des arborescences de répertoires. Accessoirement, elle vous autorise à vous tirer dans le pied, car elle est capable d'anéantir des dizaines de sites web, des années de courriels archivés, voire un serveur entier en un tournemain. Dans la panoplie des outils Unix, rm fait partie des instruments affûtés et tranchants qu'il convient de manier avec précaution.

Pour supprimer un fichier, il suffit de spécifier son nom en argument :

$ rm bonjour.txt

Vous n'obtiendrez pas de demande de confirmation du genre Êtes-vous sûr de ou autres Voulez-vous vraiment. Votre système Linux n'a rien d'une nounou qui vous prend par la main. Vous lui avez ordonné de supprimer le fichier bonjour.txt et c'est sans broncher qu'il s'est exécuté pour l'envoyer au paradis des octets. Ici, vous ne trouvez pas de Corbeille non plus, où vous auriez pu repêcher vos données malencontreusement supprimées.

Sur un poste de travail Linux, les environnements de bureau comme KDE, GNOME, Xfce ou MATE disposent bien d'une Corbeille qui permet de repêcher des fichiers supprimés en mode graphique par le biais du navigateur de fichiers. En revanche, un fichier supprimé en ligne de commande sera perdu à jamais.

Travailler avec ou sans filet ?

Si ces manières expéditives vous mettent mal à l'aise, vous pouvez toujours invoquer rm avec l'option -i (comme interactive), ce qui produit une demande de confirmation avant chaque destruction de fichier. Tapez Y pour répondre yes :

$ rm -i bonjour2.txt 
rm: remove regular file 'bonjour2.txt'? y
$ rm -i bonjour3.txt 
rm: remove regular file 'bonjour3.txt'? y

Ce fonctionnement peut être implémenté par défaut grâce à ce qu'on appelle un alias de commande. Ouvrons une petite parenthèse sur les alias.

Les alias de commande

Invoquez la commande suivante :

$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias which='alias | /usr/bin/which --tty-only –read-alias 
  --show-dot --show-tilde'

Ici, chaque entrée commençant par alias correspond à la définition d'un raccourci de commandes, le but du jeu étant visiblement d'ajouter un peu de couleur ou de vous simplifier l'utilisation de ces quelques commandes. Vous vous apercevez que le simple ls que vous avez pu invoquer jusqu'ici est enrichi par défaut avec --color=auto.

La plupart des distributions Linux grand public prédéfinissent plusieurs alias de commandes, afin de rendre l'utilisation du shell un peu plus agréable. Essayons d'en définir un nous-même :

$ alias rm='rm -i'
$ touch fichiertest
$ rm fichiertest 
rm: remove regular empty file 'fichiertest'? y

Il se peut que vous soyez confronté au cas de figure inverse, c'est-à-dire un alias de commande rm -i qui serait défini pour rm dans votre environnement de travail, alors que vous souhaitiez supprimer des fichiers directement, sans avoir à passer par la confirmation de suppression. Dans ce cas, utilisez rm avec l'option -f comme force :

$ alias rm
alias rm='rm -i'
$ touch fichierbidon
$ rm -f fichierbidon

Notre définition d'alias n'est pas persistante. Autrement dit, lorsque vous démarrerez une nouvelle session, en vous déconnectant et en vous reconnectant par exemple, votre alias individualisé aura disparu. La personnalisation persistante du shell sera abordée plus loin.

Supprimer des répertoires avec rmdir

De façon analogue à la commande rm, rmdir (remove directory) sert à supprimer des répertoires du système de fichiers :

$ mkdir repertoiretest
$ ls -ld repertoiretest
drwxrwxr-x. 2 vagrant vagrant 6 Oct 17 05:42 repertoiretest/
$ rmdir repertoiretest

Le répertoire que vous souhaitez supprimer doit impérativement être vide. Dans le cas contraire, rmdir refuse de s'exécuter et vous obtenez un message d'erreur :

$ mkdir repertoiretest
$ touch repertoiretest/fichiertest
$ rmdir repertoiretest/
rmdir: failed to remove 'repertoiretest/': Directory not empty

Dans ce cas, c'est-à-dire si l'on souhaite supprimer un répertoire ainsi que tout son contenu, on peut avoir recours à la commande rm suivie de l'option -r (comme recursive). Dans l'exemple suivant, j'ajoute l'option -i pour bien expliciter chaque opération de suppression :

$ tree repertoiretest 
repertoiretest
`-- fichiertest
$ rm -ri repertoiretest 
rm: descend into directory 'repertoiretest'? y
rm: remove regular empty file 'repertoiretest/fichiertest'? y
rm: remove directory 'repertoiretest'? y

Dans la pratique quotidienne, c'est plutôt l'inverse que l'on souhaite faire. Il est souvent fastidieux de confirmer chaque suppression dans une arborescence de répertoires. Dans certains cas de figure, c'est même impossible. Lorsque vous décidez par exemple de nettoyer vos anciens répertoires de sources du noyau, il vous faudrait confirmer quelques dizaines de milliers d'opérations de suppression. C'est là que l'option -f (force) intervient :

$ alias rm
alias rm='rm -i'
$ mkdir repertoiretest
$ touch repertoiretest/fichiertest
$ rm -rf repertoiretest

Comme l'exemple précédent vous le montre, rm -rf ne vous demande pas votre avis et anéantit joyeusement tout ce que vous spécifiez, à condition que vous en ayez le droit, bien sûr. Invoquée en tant que root, la commande rm -rf peut même vous faire commettre l'équivalent numérique d'un Seppuku.

Un coup d'essuie-glace avec clear

J'en profite pour vous montrer l'équivalent d'un coup d'essuie-glace dans votre terminal. Remplissez ce dernier avec n'importe quelle commande susceptible de bien l'encombrer (par exemple ls /etc), puis essayez ceci :

$ clear

Pour aller plus vite, utilisez simplement le raccourci clavier Ctrl+L, ce qui revient au même.


La rédaction de ces cours demande du temps et des quantités significatives de café espresso. Vous appréciez cette formation ? Offrez un café au formateur.