Primeiro de tudo, não há necessidade de um loop, find
pode fazer tudo isso sozinho. Você pode negar condições usando os sinalizadores !
ou -not
. Você também não quer -o
, pois isso significa "localizar arquivos / pastas cujo nome não é foobar ou cujo nome não é doobar". Isso encontraria tudo desde que uma ou outra condição sempre será verdadeira ( foobar
corresponde a "não doobar" e doobar
corresponde a "não foobar"). O que você queria é algo como:
find /path/to/parent/dirs/* -type d ! -name "*foobar*" ! -name "*doobar*" -delete
ou
find /path/to/parent/dirs/* -type -d -not -name "*foobar*" -not -name "*doobar*" -delete
Você também pode, se desejar, fazer isso no shell. Por exemplo, com bash
:
for i in /path/to/parent/dirs/*/; do
[[ "$i" =~ 'foobar' || "$i" =~ 'doobar' ]] || rm -rf "$i";
done
Não tenho certeza sobre os detalhes e não tenho um mac para testar isso, mas parece que o OSX não permite excluir diretórios. Eu acredito (mas não tenho certeza) que isso é o que este código faz :
/* Potentially unsafe - do not accept relative paths whatsoever */
if (strchr(entry->fts_accpath, '/') != NULL)
errx(1, "-delete: %s: relative path potentially not safe",
entry->fts_accpath);
Uma maneira de contornar isso é usar -exec
:
find /path/to/parent/dirs/ -type d ! -name "*foobar*" ! -name "*doobar*" \
-exec rm -rf {} +
Todos esses comandos excluirão coisas. Teste-os antes de usar!