Apagar arquivos recursivamente que NÃO correspondem a regexp

1

Estou tentando limpar vários arquivos temporários de uma árvore de pastas, mas não quero excluir arquivos que correspondam a alguns critérios, especificamente arquivos executáveis, arquivos .tpl e não a subpasta 'data'.

Eu vejo a pergunta aqui

Excluir arquivos em um diretório que corresponde a um regexp, usando um terminal Mac

é quase o que estou procurando, mas eles têm um regex que estão tentando corresponder, e eu tenho um regex que não quero correspondências. Eu posso fazer isso para encontrar todos os arquivos que eu não posso excluir:

find . -executable -o -regex '.*\.tpl'

Existe uma maneira de inverter as correspondências, como -v com regex?

    
por EvilAmarant7x 27.06.2011 / 15:49

2 respostas

6

Is there a way to invert the matches, like -v does with regex?

Use negation ( ! ):

find . -executable -o ! -regex '.*\.tpl' -exec rm -i {} \+
    
por 27.06.2011 / 16:20
2

Uma maneira conveniente de executar um comando para tudo, exceto arquivos que correspondem a determinadas condições, é explorar o comportamento de curto-circuito do -o , por exemplo, find -cond1 -cond2 -o -exec command significa "se cond1 e cond2 não fizer nada, senão execute command ".

find . -type f -executable -o -name '*.tpl' -o -exec rm -i {} \+

Para excluir o diretório data , use a ação -prune , que significa "ignorar esse diretório e não recorrer a ele". Use -name data para corresponder a todos os diretórios chamados data ou -path ./data para corresponder apenas no nível superior.

find . -type f -executable -o \
       -name '*.tpl' -o \
       -type d -name data -prune -o \
       -exec rm -i {} \+

Bônus: o mesmo em zsh.

rm -i -- **/*~*.tpl~data/*(.^*)
  • O % operador~ exclui arquivos que correspondem a determinados padrões (você deve fazer setopt extended_glob primeiro).
  • **/ realiza globalização recursiva
  • O qualificador de glob% restringe a correspondência inteira a arquivos comuns e . exclui arquivos executáveis ( ^* nega os qualificadores que vêm depois dele; os qualificadores são anded).
por 27.06.2011 / 23:48

Tags