web-dev-qa-db-fra.com

Supprimer tous les répertoires d'un répertoire parent sauf un et ses descendants

directory structure

Je veux supprimer le répertoire B et D. Mais je veux garder C et tous ses fichiers et répertoires descendants. Quelle est la commande pour supprimer tous les répertoires enfants d'un répertoire parent à l'exception d'un répertoire et de ses enfants.

Aide appréciée.

8
Joe Saad

Ce que vous voulez, c'est cette commande:

find ~/TESTDIR -mindepth 1 -maxdepth 1 -type d -not \( -name "keepMe" \) -exec rm -rf {} \;

Démo:

# List what's inside directory we want to remove
$ ls
file1  file2  keepMe/  removeA/  removeB/
# Testing what find gives without removing
$ find ~/TESTDIR -mindepth 1 -type d -not \( -name "keepMe" \)               
/home/xieerqi/TESTDIR/removeA
/home/xieerqi/TESTDIR/removeB
# Actual removal and testls
$ find ~/TESTDIR -mindepth 1 -maxdepth 1 -type d -not \( -name "keepMe" \) -exec rm -rf {} \;
$ ls
file1  file2  keepMe/

Explication:

  • find DIRECTORY appelez la commande find pour opérer sur DIRECTORY
  • -mindepth 1: fonctionne uniquement avec le contenu du répertoire, évitez le répertoire lui-même qui est de niveau 0
  • -maxdepth 1: empêche la descente dans les sous-répertoires (rm -rf est quand même récursif, nous n'avons donc pas besoin de descendre dans les sous-répertoires pour les supprimer)
  • -type d: recherche uniquement dans les répertoires
  • -not \( -name "keepMe" \) ignorer l'élément avec le nom que vous souhaitez conserver
  • -exec rm -rf {} \; effectuer une suppression sur chaque objet trouvé
6
Sergiy Kolodyazhnyy

Utilisation des fonctionnalités extended glob du bash Shell (activées par défaut dans les installations Ubuntu actuelles), à condition

$ tree A
A
├── B
├── C
│   ├── ac1
│   └── ac2
└── D

5 directories, 0 files

vous pouvez adresser tout sauf C et son contenu à l'aide de l'expression globale A/!(C) c'est-à-dire.

$ echo A/!(C)
A/B A/D

Donc, pour supprimer tout sauf le répertoire C et son contenu, vous pouvez simplement utiliser

rm -rf A/!(C)

en quittant

$ tree A
A
└── C
    ├── ac1
    └── ac2

3 directories, 0 files
8
steeldriver

Un moyen simple serait d'utiliser trash-cli

vous pouvez l'installer avec Sudo apt-get install trash-cli

une fois installé, vous pouvez naviguer vers le répertoire parent A avec cd /A puis émettre la commande trash B D où B et D sont les répertoires que vous souhaitez supprimer (ils se retrouveront dans la corbeille du lecteur sont sur, donc si vous faites une erreur, vous pouvez récupérer les fichiers)

Testé sous Ubuntu 16.04 et 14.04

5
Elder Geek

Utilisez simplement les boucles for de Bash et test pour filtrer les répertoires souhaités et la commande rm -rf pour supprimer les répertoires de manière récursive, comme ceci:

for x in /path/to/parent/*; do test "$x" != "dir_survive" && rm -rf "$x"; done

Cela effectue une itération sur tous les éléments (fichiers et répertoires) à l'intérieur de /path/to/parent/ et supprime l'élément de manière récursive si son nom n'est pas égal à dir_survive. Si le répertoire parent est le répertoire actuel, vous ne pouvez écrire que * en tant que chemin.

Si vous n'êtes pas sûr et que vous souhaitez tester les éléments à supprimer en premier sans rien faire, remplacez simplement le rm -rf dans la commande ci-dessus par echo et les résultats de la suppression seront uniquement sortis.

Voici un exemple d'exécution:

$ tree
.
├── dir1
│   ├── subdir1
│   │   ├── file1
│   │   └── file2
│   └── subdir2
│       ├── file1
│       └── file2
├── dir2
│   ├── subdir1
│   │   ├── file1
│   │   └── file2
│   └── subdir2
│       ├── file1
│       └── file2
└── dir_survive
    ├── subdir1
    │   ├── file1
    │   └── file2
    └── subdir2
        ├── file1
        └── file2

9 directories, 12 files

$ for x in *; do test "$x" != "dir_survive" && rm -rf "$x"; done

$ tree
.
└── dir_survive
    ├── subdir1
    │   ├── file1
    │   └── file2
    └── subdir2
        ├── file1
        └── file2

3 directories, 4 files
4
Byte Commander