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 metacaracter 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/
".