Acho mais fácil usar uma expressão regular para corresponder aos caminhos
-
./B/A -
./B/A/A -
./B/A/B -
./B/A/B/C - et cetera
Assim, o seguinte corresponderá a ./A ou qualquer coisa abaixo da pasta ./B/A , incluindo-a. Eu adicionei um \ para tornar o comando mais legível. Observe também que isso funciona apenas com o GNU find , ou seja, não no BSD find .
find -depth -regextype posix-extended -mindepth 1 \
! \( -path "./A" -or -regex "\./B(/A(/.*)?)?" \)
Para explicar o regex: O /.* corresponde a qualquer coisa no diretório A . Você precisa da barra aqui, porque senão um diretório chamado AB teria sido correspondido também. Esse padrão anterior pode aparecer zero vezes (para o diretório A ) ou uma vez (para qualquer coisa abaixo de A ), é por isso que precisamos do ? . Como não queremos excluir B , a parte depois disso pode ocorrer zero ou uma vez ( ? ).
Como há uma negação ( ! ), o comando find corresponde:
./B/B
./B/C
./C
Você pode então adicionar a opção -exec rm -rf {} para remover esses arquivos e pastas. Precisamos que a opção -depth comece com a mais profunda, para não tentar remover pastas que não existem mais.