O que você quer é este comando:
find ~/TESTDIR -mindepth 1 -maxdepth 1 -type d -not \( -name "keepMe" \) -exec rm -rf {} \;
Demo:
# 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/
Explicação:
-
find DIRECTORYchamar comando de localização para operar em DIRETÓRIO -
-mindepth 1: trabalhe apenas com o conteúdo do diretório, evite o próprio diretório que é o nível 0 -
-maxdepth 1: impede a descida em subdiretórios (rm -rfé recursivo de qualquer forma, portanto, não precisamos descer em subdiretórios para removê-los) -
-type d: pesquisa apenas por diretórios -
-not \( -name "keepMe" \)ignora o item com o nome que você deseja manter -
-exec rm -rf {} \;executa a remoção em cada item encontrado