Supprimer sous-dossiers sauf exceptions
Notes › _DIFFUSION › Linux cli scripts
Problème
linux cli, dans un dossier je veux supprimer tous les sous-dossiers à l’exception de quelques uns dont je connais les noms Exemple concret:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/src/lib/docs/
├── be
├── ca
├── cs
├── da
├── de
├── el
├── en
├── es
├── eu
├── fi
├── fr
├── he
├── hu
├── uk
├── vi
├── zh
└── zh-HK
Je veux garder les sous dossiers en et fr
Solution
Voici un script Bash qui supprime tous les sous-dossiers d’un dossier donné, sauf ceux passés en paramètres.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/usr/bin/env bash
set -euo pipefail
# Usage: ./purge-dirs.sh /path/to/base keep1 keep2 ...
# Exemple: ./purge-dirs.sh /src/lib/docs en fr
if [ "$#" -lt 2 ]; then
echo "Usage: $0 dossier keep1 [keep2 ...]"
exit 1
fi
base="$1"; shift
# Vérifs rapides
[ -d "$base" ] || { echo "Erreur: dossier introuvable: $base" >&2; exit 1; }
# Construire une liste des dossiers à garder
# (on utilise un tableau pour gérer les noms tels quels)
kept=( "$@" )
# Parcourir les sous-dossiers et les supprimer si non gardés
shopt -s nullglob
for d in "$base"/*/; do
name="$(basename "$d")"
keep=false
for k in "${kept[@]}"; do
if [ "$name" = "$k" ]; then
keep=true
break
fi
done
$keep || rm -rf -- "$d"
done
Exemple :
1
./purge-dirs.sh /src/lib/docs en fr