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:
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:
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:
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
:
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:
find ~/Downloads -mindepth 1 -mtime -10 -delete
Você também pode gostar de: 179 Esquemas de cores para o terminal Linux baseado em Gtk (Terminal Gnome, Tilix, Terminal Xfce, mais)
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.
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):
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:
find /caminho/do/diretorio/ -mindepth 1 -mtime +N -exec rm -rf {} ;
Exclua apenas arquivos regulares com mais de N dias, mantendo subdiretórios vazios:
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:
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:
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:
find /caminho/do/diretorio/ -mindepth 1 -ctime +N -delete
Você pode gostar de: Histórico do Bash: como mostrar um carimbo de data/hora quando cada comando foi executado
Esse post foi traduzido do site LinuxUprising.com pela rtland.team.
Confira a versão original desse post em inglês:
How To Delete Files Older Or Newer Than N Days Using find (With Extra Examples)