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.