Supprimer sous-dossiers sauf exceptions

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