15%

Économisez 15% sur tous les services d'hébergement

Testez vos compétences et obtenez Réduction sur tout plan d'hébergement

Utilisez le code :

Skills
Commencer
15.12.2023

Suppression de tous les fichiers dans un dossier sous Linux : Guide technique complet

Supprimer des fichiers sous Linux signifie les retirer définitivement du système de fichiers sans corbeille native ni mécanisme d’annulation. L’outil principal pour cette opération est la commande rm, complétée par find, rsync, et l’expansion glob du shell — chacun adapté à différents scénarios allant de la suppression d’un seul fichier au nettoyage en masse basé sur des critères portant sur des millions d’inodes.

Étant donné que la suppression de fichiers sous Linux est irréversible par défaut, comprendre le comportement exact de chaque méthode — notamment la façon dont elles gèrent les liens symboliques, les fichiers cachés, les points de montage et les descripteurs de fichiers ouverts — n’est pas facultatif. C’est la différence entre une tâche de maintenance propre et une perte de données catastrophique dans un environnement de production.

Pourquoi la suppression de fichiers sous Linux exige de la précision

Lorsque vous supprimez un fichier avec rm, le noyau décrémente le nombre de liens physiques du fichier. Les blocs de données réels ne sont libérés que lorsque ce compteur atteint zéro et qu’aucun processus ne détient de descripteur de fichier ouvert vers l’inode. Cela a deux conséquences pratiques :

  • Un processus en cours d’exécution peut toujours lire un fichier « supprimé » s’il a ouvert le descripteur de fichier avant la suppression. L’espace disque n’est pas récupéré tant que le processus ne ferme pas ou ne se termine pas.
  • La suppression d’une entrée de répertoire ne garantit pas une récupération immédiate de l’espace disque sur les systèmes actifs.

Dans un environnement d’hébergement VPS ou de Serveur Dédié, où plusieurs services partagent le même système de fichiers, comprendre ce comportement évite toute confusion lorsque df n’affiche aucun espace libéré après une suppression importante.

Méthode 1 : Suppression de fichiers de base avec rm

La commande rm est l’utilitaire POSIX standard pour supprimer des fichiers et des entrées de répertoire.

rm /path/to/filename

Options principales :

OptionComportement
-fForcer la suppression ; supprime les erreurs pour les fichiers inexistants et ne demande jamais de confirmation
-iMode interactif ; demande une confirmation avant chaque suppression
-IDemande une confirmation avant de supprimer plus de 3 fichiers ou de récurser
-vVerbeux ; affiche le nom de chaque fichier au moment de sa suppression
-r / -RRécursif ; supprime les répertoires et l’intégralité de leur contenu

Supprimer tous les fichiers d’un répertoire sans supprimer le répertoire lui-même :

rm /path/to/folder/*

Piège critique — les fichiers cachés ne sont pas pris en compte par * : Le glob * ne se développe pas en dotfiles (fichiers commençant par .). Pour supprimer également les fichiers cachés :

rm /path/to/folder/* /path/to/folder/.[!.]* /path/to/folder/..?*

Le motif .[!.]* correspond à tous les dotfiles sauf . et ... Le motif ..?* couvre les cas limites comme ..foo. Omettre ces motifs est l’une des erreurs les plus courantes lors du nettoyage des répertoires de configuration d’applications.

Méthode 2 : Suppression récursive avec rm -r

Pour supprimer un répertoire et tout ce qu’il contient — fichiers, sous-répertoires et leur contenu :

rm -r /path/to/folder/

Cette commande parcourt l’arborescence de répertoires en profondeur d’abord, supprimant les fichiers avant leurs répertoires parents. Sur des arborescences très profondes, rm -r peut atteindre la limite de pile de récursion du noyau, bien que cela soit rare en pratique.

Combinaison avec -f pour une utilisation non interactive dans les scripts :

rm -rf /path/to/folder/

Il s’agit de la combinaison la plus dangereuse en administration système Linux. Elle supprimera tout ce qui se trouve sous le chemin spécifié sans aucune confirmation, y compris les liens symboliques (mais pas leurs cibles), les fichiers spéciaux et les répertoires. Il n’existe aucune voie de récupération sans sauvegarde.

Cas limite réel : Si vous ajoutez accidentellement un espace avant le chemin dans un script :

rm -rf $TARGET_DIR /

Si $TARGET_DIR est vide ou non défini et que le shell n’a pas nounset (set -u) activé, cela se développe en rm -rf /, ce qui tente d’effacer le système de fichiers racine. Utilisez toujours set -u dans les scripts de production et mettez les variables entre guillemets : "$TARGET_DIR".

Méthode 3 : Suppression basée sur des critères avec find

La commande find est l’outil approprié lorsque vous devez supprimer des fichiers en fonction d’attributs plutôt que du seul nom. Elle offre une précision chirurgicale que rm seul ne peut pas fournir.

Supprimer uniquement les fichiers ordinaires dans un répertoire (non récursif) :

find /path/to/folder -maxdepth 1 -type f -delete

Supprimer les fichiers de plus de 30 jours :

find /path/to/folder -type f -mtime +30 -delete

Supprimer les fichiers de plus de 100 MB :

find /path/to/folder -type f -size +100M -delete

Supprimer les fichiers correspondant à une extension spécifique :

find /path/to/folder -type f -name "*.log" -delete

Supprimer les répertoires vides après avoir effacé leur contenu :

find /path/to/folder -type d -empty -delete

find -exec rm vs. find -delete

ApprocheMécanismePerformanceSécurité
find ... -exec rm {} ;Crée un nouveau processus rm par fichierLent avec un grand nombre de fichiers (surcharge de fork)Légèrement plus portable
find ... -exec rm {} +Regroupe les fichiers en une seule invocation de rmBeaucoup plus rapide ; similaire à xargsPortable et efficace
find ... -deleteAppel système unlinkat() du noyau directement depuis findLe plus rapide ; aucun sous-processusNécessite un ordre -depth pour les répertoires

Préférez toujours -delete ou -exec rm {} + à -exec rm {} ; lorsque vous traitez des milliers de fichiers. La surcharge fork() par fichier de la forme avec point-virgule peut faire durer un nettoyage de 100 000 fichiers des minutes au lieu de secondes.

Règle d’ordre importante : Lors de l’utilisation de -delete pour supprimer à la fois des fichiers et leurs répertoires parents en un seul passage find, ajoutez toujours -depth pour traiter le contenu des répertoires avant les répertoires eux-mêmes :

find /path/to/folder -depth -delete

Sans -depth, find peut tenter de supprimer un répertoire avant son contenu, provoquant des erreurs Directory not empty.

Méthode 4 : Utilisation de l’expansion glob du shell avec bash

Pour les scénarios où vous souhaitez vider le contenu d’un répertoire sans lancer de processus externes, l’expansion glob intégrée de Bash combinée avec rm est efficace :

shopt -s dotglob nullglob
rm -rf /path/to/folder/*/
rm -f /path/to/folder/*
shopt -u dotglob nullglob
  • dotglob fait en sorte que * inclue les fichiers cachés.
  • nullglob empêche rm de recevoir un * littéral si le répertoire est déjà vide, ce qui provoquerait une erreur.

Méthode 5 : Suppression haute performance avec rsync

Lorsqu’un répertoire contient des millions de fichiers, rm -rf peut être extrêmement lent car il doit effectuer stat() et unlink() sur chaque inode individuellement. Une technique bien connue des administrateurs système consiste à utiliser rsync pour synchroniser un répertoire vide sur la cible :

mkdir /tmp/empty_dir
rsync -a --delete /tmp/empty_dir/ /path/to/folder/
rmdir /tmp/empty_dir

rsync utilise un parcours de répertoire hautement optimisé et peut surpasser rm -rf sur les systèmes de fichiers contenant des millions de petits fichiers (courant dans les spools de messagerie, les caches de sessions et les répertoires de sessions PHP). Il s’agit d’une technique pratique sur tout Serveur Dédié exécutant des applications à fort trafic.

Méthode 6 : Tronquer des fichiers sans les supprimer

Parfois, vous devez effacer le contenu d’un fichier sans supprimer l’inode — notamment pour les fichiers journaux qu’un démon en cours d’exécution maintient ouverts. Supprimer et recréer le fichier briserait le descripteur de fichier ouvert.

Tronquer à zéro octet tout en préservant l’inode :

> /path/to/logfile.log

Ou de manière équivalente :

truncate -s 0 /path/to/logfile.log

C’est la bonne façon d’effacer les fichiers journaux actifs sur un serveur en production. Utiliser rm sur un fichier journal ouvert libère l’entrée de répertoire, mais le démon continue d’écrire dans l’inode désormais invisible, consommant de l’espace disque jusqu’au redémarrage du processus.

Comparaison de toutes les méthodes de suppression

MéthodeSupprime les fichiers cachésRécursifBasé sur des critèresPerformance sur de grands ensemblesNiveau de risque
rm fileN/ANonNonÉlevéeFaible
rm *Non (sans dotglob)NonNonÉlevéeMoyen
rm -rf dir/OuiOuiNonMoyenTrès élevé
find -deleteOuiConfigurableOuiÉlevéeMoyen
find -exec rm {} +OuiConfigurableOuiMoyen-élevéMoyen
rsync --deleteOuiOuiNonTrès élevée (millions de fichiers)Faible
truncate / >N/ANonNonTrès élevéeTrès faible

Permissions, propriété et bit sticky

La suppression de fichiers sous Linux est régie par les permissions du répertoire, et non par les permissions du fichier. Pour supprimer un fichier, vous avez besoin des permissions d’écriture (w) et d’exécution (x) sur le répertoire parent — et non sur le fichier lui-même. Cela surprend de nombreux utilisateurs qui constatent qu’ils ne peuvent pas supprimer un fichier leur appartenant dans un répertoire appartenant à un autre utilisateur.

Le bit sticky (chmod +t /dir) sur un répertoire (le plus célèbre étant /tmp) restreint la suppression de sorte que seul le propriétaire du fichier, le propriétaire du répertoire ou root puisse supprimer des fichiers, indépendamment des permissions d’écriture sur le répertoire. Ceci est essentiel dans les environnements d’hébergement mutualisé.

Sur une plateforme d’hébergement Web Mutualisé, le bit sticky et la propriété correcte des répertoires empêchent les scripts d’un utilisateur de supprimer les fichiers d’un autre utilisateur dans les répertoires temporaires partagés.

Prévisualiser les suppressions en toute sécurité avant de les exécuter

Avant d’exécuter toute commande destructrice en production, prévisualisez ce qui sera supprimé :

Prévisualisation avec find avant la suppression :

find /path/to/folder -type f -mtime +30

Exécutez sans -delete d’abord. Redirigez vers wc -l pour compter les fichiers concernés :

find /path/to/folder -type f -mtime +30 | wc -l

Simulation avec rsync :

rsync -a --delete --dry-run /tmp/empty_dir/ /path/to/folder/

Utilisez ls pour vérifier l’expansion glob :

ls /path/to/folder/* /path/to/folder/.[!.]*

Ne substituez jamais cette étape par des suppositions, surtout sur des systèmes où des variables d’environnement définissent des chemins.

Automatiser les tâches de nettoyage en toute sécurité

Sur les serveurs de production — qu’il s’agisse d’instances d’hébergement VPS ou de Serveurs Dédiés bare-metal — le nettoyage automatisé est généralement géré via cron ou des minuteries systemd. Un script de nettoyage robuste doit suivre ces principes :

#!/bin/bash
set -euo pipefail

TARGET="/var/app/cache"

# Validate target is not empty and is a directory
if [[ -z "$TARGET" || ! -d "$TARGET" ]]; then
    echo "ERROR: Invalid target directory." >&2
    exit 1
fi

# Delete files older than 7 days
find "$TARGET" -type f -mtime +7 -delete
echo "Cleanup complete: $TARGET"

Mesures défensives clés dans ce script :

  • set -euo pipefail — quitte en cas d’erreur, traite les variables non définies comme des erreurs et détecte les échecs dans les pipes.
  • Validation explicite du répertoire avant toute suppression.
  • Variables entre guillemets tout au long du script pour éviter le découpage de mots.

Pour les applications web gérées via un panneau de contrôle, le VPS avec cPanel fournit une gestion des tâches cron via une interface graphique, réduisant le risque d’erreurs de syntaxe dans les tâches de suppression planifiées.

Considérations spécifiques aux systèmes de fichiers

Les différents systèmes de fichiers Linux gèrent la suppression différemment, ce qui affecte à la fois les performances et la récupérabilité :

  • ext4 : Utilise un journal. Les métadonnées des fichiers supprimés sont journalisées avant que l’inode ne soit libéré. Certains outils forensiques peuvent récupérer des fichiers récemment supprimés depuis les journaux ext4.
  • XFS : Optimisé pour les fichiers volumineux et la suppression à haut débit. rm -rf sur XFS avec des millions de fichiers est significativement plus rapide que sur ext4 grâce à l’indexation de répertoires par arbre B.
  • Btrfs : Prend en charge les instantanés. La suppression d’un fichier dans un sous-volume Btrfs ne libère pas d’espace si un instantané référence les mêmes blocs de données. Vérifiez toujours l’utilisation des instantanés avec btrfs subvolume list avant d’espérer récupérer de l’espace disque.
  • tmpfs : Système de fichiers en mémoire. La suppression est instantanée et l’espace est récupéré immédiatement. Couramment utilisé pour /tmp et le stockage de sessions.
  • Montages NFS : La suppression de fichiers via NFS crée des fichiers temporaires .nfsXXXXXX si un processus distant a le fichier ouvert. Ces fichiers sont nettoyés lorsque le descripteur de fichier distant se ferme.

Liste de contrôle technique avant de supprimer des fichiers sur un serveur Linux

  • Confirmez le chemin exact avec pwd et ls avant d’exécuter toute commande rm.
  • Utilisez find sans -delete d’abord pour prévisualiser la liste des fichiers.
  • Vérifiez les descripteurs de fichiers ouverts avec lsof +D /path/to/folder avant de supprimer des fichiers dans les répertoires d’applications actives.
  • Vérifiez qu’aucun processus en cours d’exécution ne dépend du répertoire avec fuser -m /path/to/folder.
  • Sur Btrfs, vérifiez les instantanés avant d’espérer que l’espace disque soit libéré.
  • Utilisez set -euo pipefail dans tous les scripts de suppression automatisés.
  • Mettez toutes les variables entre guillemets dans les scripts pour éviter une suppression accidentelle au niveau racine.
  • Pour les fichiers journaux maintenus ouverts par des démons, utilisez la troncature (> ou truncate -s 0) plutôt que rm.
  • Sur les systèmes partagés, vérifiez les permissions des répertoires et les paramètres du bit sticky avant de supposer que la suppression réussira.
  • Maintenez des sauvegardes à jour. Aucune méthode de suppression n’est sûre sans une voie de récupération vérifiée.

FAQ

Q : rm -rf /path/to/folder/* supprime-t-il les fichiers cachés ?

Sans activer dotglob dans Bash, le glob * ne se développe pas en fichiers commençant par un point. Les fichiers cachés tels que .env, .htaccess et .gitignore seront laissés en place. Utilisez shopt -s dotglob avant la commande, ou ajoutez explicitement .[!.]* à votre motif glob.

Q : Pourquoi l’espace disque n’est-il pas libéré immédiatement après la suppression de fichiers volumineux ?

Si un processus en cours d’exécution détient un descripteur de fichier ouvert vers le fichier supprimé, le noyau maintient les blocs de données alloués jusqu’à la fermeture de ce descripteur. Utilisez lsof | grep deleted pour identifier les processus détenant des fichiers supprimés ouverts. Redémarrer le service ou le processus concerné libérera l’espace.

Q : Quelle est la méthode la plus sûre pour vider un répertoire contenant des millions de fichiers ?

La méthode rsync --delete (synchronisation d’un répertoire vide sur la cible) est généralement l’approche la plus performante et la moins sujette aux erreurs pour un très grand nombre de fichiers. Elle évite la limite de longueur de la liste d’arguments du shell (E2BIG) que rm * peut atteindre, et est plus rapide que les invocations rm par fichier sur la plupart des systèmes de fichiers.

Q : Les fichiers supprimés peuvent-ils être récupérés sous Linux ?

Par défaut, Linux ne dispose pas de corbeille. Cependant, sur les systèmes de fichiers ext4, les fichiers récemment supprimés peuvent être récupérables à l’aide d’outils comme extundelete ou testdisk si le disque n’a pas été fortement écrit depuis la suppression. Sur Btrfs avec les instantanés activés, la récupération est simple via la restauration d’instantané. C’est pourquoi le maintien de sauvegardes est non négociable dans tout environnement de production.

Q : Comment supprimer des fichiers dans un répertoire sans supprimer le répertoire lui-même ?

Utilisez find /path/to/folder -mindepth 1 -delete pour supprimer tout le contenu — y compris les fichiers cachés et les sous-répertoires — tout en laissant le répertoire parent intact. Alternativement, rm -rf /path/to/folder/* avec dotglob activé permet d’obtenir le même résultat pour le niveau supérieur uniquement.

15%

Économisez 15% sur tous les services d'hébergement

Testez vos compétences et obtenez Réduction sur tout plan d'hébergement

Utilisez le code :

Skills
Commencer