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.
Ce que vous voulez, c'est cette commande:
find ~/TESTDIR -mindepth 1 -maxdepth 1 -type d -not \( -name "keepMe" \) -exec rm -rf {} \;
# 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/
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é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
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
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