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 DIRECTORY
chamar 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