Просто використовуйте for
цикл Баша та 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