Просто используйте forцикл Bash и testотфильтруйте нужные каталоги, а rm -rfкоманду рекурсивно удалите каталоги, например:
for x in /path/to/parent/*; do test "$x" != "dir_survive" && rm -rf "$x"; done
Это перебирает все элементы (файлы и каталоги) внутри /path/to/parent/и рекурсивно удаляет элемент, если его имя не равноdir_survive . Если родительский каталог является текущим каталогом, вы можете писать только *как путь.
Если вы не уверены и хотите сначала проверить, какие элементы будут удалены без каких-либо действий, просто замените rm -rfв приведенной выше команде наecho и она выведет только кандидатов на удаление.
Вот пример запуска:
$ 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