# 2.3 - Supprimer sans se tromper

Sous Linux, `rm` ne place généralement pas les éléments dans une corbeille. Une suppression en ligne de commande peut donc être immédiate et difficile à récupérer.

## Supprimer un fichier ou un dossier vide

```bash
rm fichier.tmp
rm -i fichier.tmp       # demander confirmation
rmdir dossier-vide
```

Supprimer plusieurs fichiers précis :

```bash
rm -- fichier1.tmp fichier2.tmp
```

## Supprimer un dossier et son contenu

```bash
rm -r ancien-dossier/
rm -ri ancien-dossier/  # confirmation interactive
```

L'option `-f` force la suppression et réduit les protections. La combinaison `rm -rf` doit rester exceptionnelle et ne doit être utilisée qu'après vérification exacte de la cible.

## Méthode sûre avec un motif

Avant de supprimer tous les fichiers `.tmp`, afficher ce que le shell sélectionne :

```bash
printf '%s\n' -- *.tmp
```

Puis supprimer seulement si la liste est correcte :

```bash
rm -i -- *.tmp
```

Avec `find`, commencer par `-print` :

```bash
find /var/tmp/mon-application -type f -name '*.tmp' -print
```

Après contrôle :

```bash
find /var/tmp/mon-application -type f -name '*.tmp' -delete
```

L'ordre des critères de `find` compte : `-delete` ne doit être ajouté qu'à la fin, après un test réussi avec `-print`.

## Préférer une opération récupérable

Si l'environnement graphique fournit `gio` :

```bash
gio trash fichier.txt
gio trash --list
```

Autre méthode : déplacer d'abord l'élément vers un dossier de quarantaine.

```bash
mkdir -p ~/A_supprimer
mv -i ancien-dossier ~/A_supprimer/
```

## Erreurs à éviter

- Ne jamais exécuter une suppression récursive sur `/`, `/home`, `~` ou une variable non vérifiée.
- Toujours mettre les variables entre guillemets : `rm -- "$fichier"`.
- Ne pas supposer qu'une variable est définie.
- Vérifier `pwd`, puis la cible avec `ls -ld -- chemin`.
- Ne pas précéder `rm` de `sudo` si les droits normaux suffisent.

Exemple de contrôle d'une variable :

```bash
cible="/var/tmp/mon-application"
test -n "$cible" && test "$cible" != "/" && ls -ld -- "$cible"
```

Cette vérification n'autorise pas automatiquement la suppression ; elle sert seulement à examiner la cible.