Blog Linux Avante

Como excluir arquivos mais antigos ou mais recentes do que N dias usando find (com exemplos extras)

11 de setembro de 2019

Este artigo explica como excluir arquivos mais antigos ou mais recentes do que N dias, com exemplos extras, como combinar apenas arquivos usando uma extensão específica e muito mais. Para isso, usaremos find, uma ferramenta de linha de comando para pesquisar arquivos em um diretório.

Você pode excluir todos os arquivos e pastas com mais de (com o tempo de modificação de dados do arquivo anterior a) N dias de um diretório usando:

Comandos para usar no terminal

find /caminho/do/diretorio/ -mindepth 1 -mtime +N -delete

Uma explicação de todo o comando e o que você precisa substituir:

  • find é a ferramenta de linha de comando do Unix para encontrar arquivos (e mais)
  • /caminho/do/diretorio/ é o caminho do diretório onde localizar (e excluir) arquivos. Substitua-o pelo caminho do diretório do qual você deseja excluir arquivos e pastas com mais de N dias
  • -mindepth 1 é usado para não aplicar nenhum teste ou ação em níveis inferiores ao nível especificado. -mindepth 1 significa que o comando deve processar todos os arquivos, exceto os argumentos da linha de comando. Sem usar isso, o comando tentaria remover também /caminho/do/diretorio/ se ele corresponder aos critérios find. Você pode ignorá-lo em todos os comandos mencionados neste artigo se também quiser corresponder ao caminho de localização especificado. Além disso, não há necessidade de especificar isso se você procurar apenas arquivos (-type f para arquivos regulares, por exemplo), e não pastas
  • -mtime +N são arquivos correspondentes usados que tiveram seus dados (conteúdo) modificados pela última vez há N dias. Substitua N por um número (inteiro). Nesse comando, os arquivos com um tempo de modificação anterior a N dias serão excluídos. É importante observar que, por exemplo, se um arquivo foi modificado pela última vez há 1 dia e 23 horas, -mtime +1 não corresponderá a ele, tratando-o como se o arquivo tivesse sido modificado pela última vez 1 dia, 0 horas, 0 minutos e 0 segundos atrás; veja esta explicação sobre por que esse é o caso, já que find página do manual não faz isso muito bem
  • -delete exclui arquivos e pastas correspondentes

É importante observar que -delete é uma extensão GNU, portanto, não está disponível em todas as implementações find. Para outras maneiras de excluir arquivos que funcionam com todas as implementações, leia as observações mais adiante neste artigo.

Quer testar o comando sem remover nenhum arquivo ou pasta? Remova -delete e o comando listará todos os arquivos que encontrar que correspondem aos seus critérios, sem excluí-los:

Comandos para usar no terminal

find /caminho/do/diretorio/ -mindepth 1 -mtime +N

Vamos dar uma olhada em um exemplo. Para excluir todos os arquivos e pastas com mais de 10 dias da pasta ~/Downloads, você pode usar:

Comandos para usar no terminal

find ~/Downloads -mindepth 1 -mtime +10 -delete

Para excluir todos os arquivos e pastas mais recentes que (com um tempo de modificação de arquivo mais recente que) N dias, use -N em vez de +N:

Comandos para usar no terminal

find /caminho/do/diretorio/ -mindepth 1 -mtime -N -delete

Exemplo em que removeremos todos os arquivos e pastas de ~/Downloads cujo conteúdo foi modificado entre agora e 10 dias atrás:

Comandos para usar no terminal

find ~/Downloads -mindepth 1 -mtime -10 -delete

Algumas observações importantes que recomendo a leitura

  1. A ordem dos argumentos é importante! Você deve adicionar -delete após combinar os arquivos. Se for o primeiro argumento, todos os arquivos (e pastas) serão excluídos de /caminho/do/diretorio/, independentemente de corresponderem à sua consulta ou não. Portanto, sempre adicione -delete no final do comando.

  2. Nem todas as versões de find suportam -delete, que é uma extensão GNU. No caso de a versão find que você está usando não suportar -delete, você pode usar -exec rm -rf {} +, embora haja versões find que também não suportam isso pelo que li. Usando -exec rm -rf {} + para remover arquivos com mais de N dias e apenas arquivos correspondentes (mantendo subdiretórios vazios):

Comandos para usar no terminal

find /caminho/do/diretorio/ -mindepth 1 -type f -mtime +N -exec rm -rf {} +

Isso executa um único comando rm com a lista de arquivos correspondente. Além disso, isso garante que os nomes de arquivos com espaços em branco sejam passados para o comando rm executado sem serem divididos pelo shell. Também é importante notar que, embora rm tenha os argumentos -rf aqui, ele apenas removerá arquivos desde que especificamos -type -f (corresponder apenas a arquivos). 15. O que deve funcionar com qualquer versão de localização é exec rm {} \;. No entanto, ela tem um desempenho pior do que as outras duas soluções já mencionadas, porque gera um processo externo para cada arquivo removido. É por isso que deixei esta solução para o final. Use para remover todos os arquivos e pastas com mais de X dias de um diretório:

Comandos para usar no terminal

find /caminho/do/diretorio/ -mindepth 1 -mtime +N -exec rm -rf {} ;

Outros exemplos de uso de find para excluir arquivos ou pastas com base em seu tempo de modificação

Exclua apenas arquivos regulares com mais de N dias, mantendo subdiretórios vazios:

Comandos para usar no terminal

find /caminho/do/diretorio/ -mindepth 1 -type f -mtime +N -delete

Aqui, usamos -type f para corresponder apenas a arquivos regulares. Você também pode usar -type d para combinar pastas ou -type l para combinar links simbólicos.

Exclua apenas arquivos correspondentes .extensao com mais de N dias de um diretório e todos os seus subdiretórios:

Comandos para usar no terminal

find /caminho/do/diretorio/ -type f -mtime +N -name '*.extensao' -delete

Você pode adicionar -maxdepth 1 para evitar que o comando passe pelos subdiretórios e excluir apenas arquivos e diretórios de profundidade de primeiro nível:

Comandos para usar no terminal

find /caminho/do/diretorio/ -mindepth 1 -maxdepth 1 -mtime +N -delete

Você também pode usar -ctime +N, usado para combinar (e excluir neste exemplo) arquivos que tiveram seu status alterado pela última vez N dias atrás (os atributos/metadados E/OU o conteúdo do arquivo foram modificados), em oposição a -mtime, que só corresponde a arquivos com base em quando seu conteúdo foi modificado pela última vez:

Comandos para usar no terminal

find /caminho/do/diretorio/ -mindepth 1 -ctime +N -delete

Confira a versão original desse post em inglês
Propaganda
Blog Comments powered by Disqus.
Propaganda