Simplemente use el for
bucle de Bash y test
para filtrar los directorios deseados y el rm -rf
comando para eliminar directorios de forma recursiva, así:
for x in /path/to/parent/*; do test "$x" != "dir_survive" && rm -rf "$x"; done
Esto itera sobre todos los elementos (archivos y directorios) dentro /path/to/parent/
y elimina el elemento de forma recursiva si su nombre no es igual a dir_survive
. Si el directorio principal es el directorio actual, solo puede escribir *
como ruta.
Si no está seguro y quiere probar qué elementos se eliminarían primero sin realizar ninguna acción, simplemente reemplace rm -rf
el comando anterior con echo
y solo generará los candidatos de eliminación.
Aquí hay un ejemplo de ejecución:
$ 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