Pesquisa de site

3 maneiras de excluir todos os arquivos em um diretório, exceto um ou poucos arquivos com extensões


Às vezes você chega a uma situação em que precisa excluir todos os arquivos de um diretório ou simplesmente limpar um diretório removendo todos os arquivos, exceto os arquivos de um determinado tipo (terminando com uma extensão específica).

Neste artigo, mostraremos como excluir arquivos em um diretório, exceto certas extensões ou tipos de arquivo, usando os comandos rm, find e globignore.

Antes de prosseguirmos, vamos começar dando uma breve olhada em um conceito importante no Linux – correspondência de padrões de nomes de arquivos, que nos permitirá lidar com o problema em questão.

Leitura sugerida: Use o comando find para pesquisar vários nomes de arquivos/extensões no Linux

No Linux, um padrão de shell é uma string que consiste nos seguintes caracteres especiais, chamados de curingas ou metacaracteres:

  1. * – corresponde a zero ou mais caracteres
  2. ? – corresponde a qualquer caractere único
  3. [seq] – corresponde a qualquer caractere em seq
  4. [!seq] – corresponde a qualquer caractere que não esteja em seq

Existem três métodos possíveis que exploraremos aqui, e estes incluem:

Excluir arquivos usando operadores de correspondência de padrões estendidos

Os diferentes operadores de correspondência de padrões estendidos estão listados abaixo, onde lista de padrões é uma lista contendo um ou mais nomes de arquivos, separados pelo caractere |:

  1. *(pattern-list) – corresponde a zero ou mais ocorrências dos padrões especificados
  2. ?(pattern-list) – corresponde a zero ou uma ocorrência dos padrões especificados
  3. +(lista de padrões) – corresponde a uma ou mais ocorrências dos padrões especificados
  4. @(pattern-list) – corresponde a um dos padrões especificados
  5. !(pattern-list) – corresponde a qualquer coisa, exceto um dos padrões fornecidos

Para usá-los, habilite a opção de shell extglob da seguinte forma:

shopt -s extglob

1. Para excluir todos os arquivos em um diretório, exceto o nome do arquivo, digite o comando abaixo:

rm -v !("filename")

2. Para excluir todos os arquivos, exceto filename1 e filename2:

rm -v !("filename1"|"filename2") 

3. O exemplo abaixo mostra como remover todos os arquivos, exceto todos os arquivos .zip de forma interativa:

rm -i !(*.zip)

4. Em seguida, você pode excluir todos os arquivos em um diretório, exceto todos os arquivos .zip e .odt da seguinte maneira, enquanto exibe o que está sendo feito:

rm -v !(*.zip|*.odt)

Depois de ter todos os comandos necessários, desative a opção de shell extglob da seguinte forma:

shopt -u extglob

Excluir arquivos usando o comando find do Linux

Neste método, podemos usar o comando find exclusivamente com as opções apropriadas ou em conjunto com o comando xargs empregando um pipeline como nos formulários abaixo:

find /directory/ -type f -not -name 'PATTERN' -delete
find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm {}
find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm [options] {}

5. O comando a seguir excluirá todos os arquivos, exceto os arquivos .gz no diretório atual:

find . -type f -not -name '*.gz'-delete

6. Usando um pipeline e xargs, você pode modificar o caso acima da seguinte forma:

find . -type f -not -name '*gz' -print0 | xargs -0  -I {} rm -v {}

7. Vejamos um exemplo adicional, o comando abaixo apagará todos os arquivos, exceto .gz, .odt e .jpg arquivos no diretório atual:

find . -type f -not \(-name '*gz' -or -name '*odt' -or -name '*.jpg' \) -delete

Excluir arquivos usando a variável Bash GLOBIGNORE

Esta última abordagem, entretanto, só funciona com o bash. Aqui, a variável GLOBIGNORE armazena uma lista de padrões (nomes de arquivos) separados por dois pontos para ser ignorada pela expansão do nome do caminho.

Leitura sugerida: 12 exemplos práticos úteis sobre o comando Grep no Linux

Para empregar este método, vá para o diretório que deseja limpar e defina a variável GLOBIGNORE da seguinte forma:

cd test
GLOBIGNORE=*.odt:*.iso:*.txt

Neste caso, todos os arquivos, exceto .odt, .iso e .txt, serão removidos do diretório atual.

Agora execute o comando para limpar o diretório:

rm -v *

Depois, desative a variável GLOBIGNORE:

unset GLOBIGNORE

Nota: Para entender o significado dos sinalizadores empregados nos comandos acima, consulte as páginas de manual de cada comando que usamos nas diversas ilustrações.

Isso é tudo! Se você tiver alguma outra técnica de linha de comando em mente para o mesmo propósito, não se esqueça de compartilhar conosco por meio de nossa seção de comentários abaixo.