como apagar (ou manter) certas extensões de arquivos usando o busybox find?

3

Eu tenho uma pasta que contém arquivos (várias extensões de arquivo) e subpastas. Quero manter algumas extensões de arquivo e excluir o restante.

e.g. keep all .txt and .jpg files and delete all other files.

no UNIX / GNU comum, posso usar o find junto com o parâmetro "-not" para conseguir isso.

> find . -not -name "*.jpg" -not -name "*txt" -type f -delete

Mas, infelizmente, esse parâmetro não está disponível na pesquisa do busybox.

Alguma idéia de como isso pode ser feito? Muito obrigado

    
por mrjayviper 14.03.2016 / 11:19

2 respostas

4

-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.

    
por 14.03.2016 / 12:38
1

Busybox find reivindicações para oferecer suporte à opção -regex , que você pode usar para remover arquivos que fazer corresponder o padrão:

find . -type f -regex '.*\.tmp\|.*\.core' -delete

Infelizmente, excluir uma lista de extensões sem a opção -not não é possível no caso geral (tecnicamente, existe uma solução , mas não escala. Esse é o motivo para incluir a opção -not em primeiro lugar. Se você precisar excluir uma lista arbitrária de extensões, será necessário um find que suporte essa opção ou find + grep + xargs :

find . | grep -v -e '\.jpg$' -e '\.txt$' | xargs rm
    
por 14.03.2016 / 12:22

Tags