Просто используйте 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