A principal questão é que o find fornece uma linda lista de diretórios como saída, mas você precisa avaliar cada um deles por conta própria para determinar se eles têm um *ACD* em algum lugar em um subdiretório. E os comandos canalizados não parecem funcionar bem (ou de todo?) Como um argumento para encontrar -exec .
Portanto, uma abordagem seria criar seu próprio script de comando que -exec possa chamar, que retornará 0 se seu argumento não contiver subdiretório *ACD* e 1 caso contrário. Isso parece funcionar para mim:
#!/bin/sh
# script: /path/to/hasnoACD
list='find $1 -name '*ACD*''
[ "x$list" = "x" ] && exit 0 || exit 1
Então seu comando de busca desejado apenas usa -exec duas vezes:
find /a/b -type d -mindepth 2 -depth ! -name '*ACD*' -mtime +180 -exec /path/to/hasnoACD {} \; -exec rm -rf {} +
-exec /path/to/hasnoACD {} \; será avaliado como verdadeiro apenas para os casos desejados.
Outra alternativa: eu inicialmente me aproximei disso de uma maneira similar ao @ icyrock-com, em que acabei com um comando de busca canalizado para um loop while, que lida com as remoções de diretório. A sintaxe 'while' dependerá do seu shell, e você precisará de uma maneira de distinguir diretórios que contenham alguns subdiretórios *ACD* como fizemos acima com o script hasnoACD , mas no bash no FreeBSD o seguinte parece funcionar:
find /a/b -type d -mindepth 2 -depth ! -name '*ACD*' -mtime +180 | while read mydir ; do find $mydir -name '*ACD*' | xargs false && rm -rf $mydir ; done
Observe a localização dentro do loop while - somente quando esse find não retornar nada (no *ACD* subdirs) os xargs retornarão true, para que o rm -rf $mydir seja executado. Esse comportamento do xargs funciona na minha máquina FreeBSD, mas no Linux ou Solaris o comportamento é diferente, então algum outro teste seria necessário.
Como o @ icyrock-com sugere, talvez você queira fazer um mv em vez de um rm , apenas para garantir.