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.