-not
e -delete
são extensões não padrão.
Não há motivo para usar -not
, quando há um equivalente mais curto: !
.
Para -delete
, você terá que invocar rm
com o predicado -exec
:
find . ! -name '*.jpg' ! -name '*.txt' -type f -exec rm -f '{}' +
(se você tiver uma versão mais antiga do busybox, talvez seja necessário o -exec rm -f '{}' ';'
, que executa um rm
por arquivo).
Esse comando acima é padrão, portanto, funcionará não apenas no busybox, mas também com outras implementações modernas não-GNU de find
.
Note que pelo menos em sistemas GNU, esse comando (com qualquer find
de implementação, desde que use GNU fnmatch(3)
) ainda pode remover alguns arquivos cujo nome termina em .jpg
ou .txt
, como o% O padrão*.jpg
não corresponderia aos arquivos cujo nome contém caracteres inválidos na localidade atual.
Para contornar isso, você precisaria:
LC_ALL=C find . ! -name '*.jpg' ! -name '*.txt' -type f -exec rm -f '{}' +
Observe também que, contrariamente ao -delete
do GNU, essa abordagem não funcionará em árvores de diretório muito profundas, pois você acabaria alcançando o tamanho máximo de um caminho de arquivo passado à chamada do sistema unlink()
. AFAIK, com find
, não há como evitar que a implementação find
não suporte -execdir
nem -delete
.
Você também pode querer ler o considerações de segurança discutidas no GNU find
manual se você for executar esse comando em um diretório gravável por outros.