O que você quer não é possível IMHO com uma única execução de find
, a menos que você saiba que todos os diretórios a serem ignorados estão no primeiro nível de diretório.
primeiro passo
Na primeira execução, exclua todos os arquivos (ou não: não diretórios):
find . \( -type d \
\( -name '*log*' -o -name 'world*' -o -name 'crash-reports' -o -name 'banned-ips*' \) \
-prune \) -o \( -type d -o -print \)
segundo passo
Crie um arquivo fictício em cada diretório (sub) a ser ignorado:
find . -type d \( \
\( -name '*log*' -o -name 'world*' -o -name 'crash-reports' -o -name 'banned-ips*' \) \
-o \( -path '*/*log*/*' -o -path '*/world*/*' -o -path '*/crash-reports/*' -o -path '*/banned-ips*/*' \) \) \
-exec touch {}/dontdeletethisdirecory
terceiro passo
Agora todos os diretórios vazios podem ser excluídos. A abordagem simples é passar todos os diretórios para rmdir
. Apenas os vazios são excluídos:
find . -depth -type d -exec rmdir {} \;
último passo opcional
Agora você pode excluir os arquivos fictícios:
find . -type -f -name dontdeletethisdirecory -delete