Is there a way to invert the matches, like -v does with regex?
Use negation ( !
):
find . -executable -o ! -regex '.*\.tpl' -exec rm -i {} \+
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?
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/*(.^*)
~
exclui arquivos que correspondem a determinados padrões (você deve fazer setopt extended_glob
primeiro). **/
realiza globalização recursiva
.
exclui arquivos executáveis ( ^*
nega os qualificadores que vêm depois dele; os qualificadores são anded).