De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.

Remoção seletiva de arquivos em um diretório

Colaboração: Rubens Queiroz de Almeida

Data de Publicação: 04 de junho de 2014

Quando usamos o comando rm geralmente fornecemos os nomes dos arquivos ou então usamos algum metacaractere para limitar a seleção. Raramente fazemos o contrário, ou seja, apagar todos os arquivos com exceção de alguns deles.

Por exemplo, o comando "rm *.doc irá apagar TODOS os arquivos que tenham o sufixo ".doc".

Podemos sofisticar um pouco mais o uso do comando "rm", utilizando a tabela abaixo:

?(lista-de-argumentos) Casa com zero ou uma ocorrência do texto fornecida
*(lista-de-argumentos) Casa com zero ou mais ocorrências do texto fornecido
+(lista-de-argumentos) Casa com uma ou mais ocorrências do texto fornecido
@(lista-de-argumentos) Casa com um dos argumentos fornecidos
!(lista-de-argumentos) Casa com tudo menos o argumento fornecido

Podem ser espeficados vários argumentos entre parênteses, basta separá-los com o caractere "|" (pipe).

Exemplos

  • Apagar todos os arquivos do diretório local MENOS o arquivo arquivo1.doc:

    $ rm !(arquivo1.doc)

O caractere "!" funciona como uma negação da expressão em parenteses.

  • Apaga todos os arquivos exceto os arquivos "arquivo1.doc" e "arquivo2.doc":

    $ rm !(arquivo1.doc|arquivo2.doc)

  • Apaga todos os arquivos exceto aqueles terminados em ".zip":

    $ rm !(*.zip)

  • Apaga todos os arquivos exceto os arquivos terminados em ".iso" e ".zip":

    $ rm !(*.zip|*.iso)

Para que esta funcionalidade funcione, é preciso que o recurso extglob esteja ativo:

 
$ shopt extglob
extglob         off

Para ativar:

 $ shopt -s extglob

Por padrão, esta funcionalidade já vem ativada em grande parte das distribuições GNU/Linux.

Este recurso pode ser usado com qualquer comando:

 mv !(*.txt) /tmp

Neste exemplo, todos os arquivos que NÃO possuam o sufixo ".txt" são movidos para o diretório "/tmp/".

Referências:

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários (1)

Avatar
Novo

Uma dica sobre a dica:

Como a expressão é usada como parâmetro e sem filtro (por exemplo entre apóstrofos) é provável que a expansão do parâmetro sea feita pela $SHELL. Por isso essas mesmas expressões podem ser usadas com outros comandos.

Por exemplo, para testar a expansão sem correr o risco do uso do rm(1) pode-se usar o comando "echo":

$ echo *.doc

Intranet.doc Proposta.doc Qualidade de Vida.doc



Veja a relação completa dos artigos de Rubens Queiroz de Almeida