Gerenciar manualmente a limpeza do sistema de arquivos é uma tarefa tediosa e ineficaz. A solução ideal é automatizar esse processo.
A ação de excluir arquivos e pastas manualmente pode ser bastante entediante e repetitiva. Automatizá-la não só economiza tempo, mas também garante uma limpeza mais consistente e organizada do sistema.
É nesse contexto que o Python se destaca, oferecendo uma solução prática e eficiente para simplificar nossas vidas. Python, sendo uma linguagem de programação versátil, é perfeita para a criação de scripts que automatizam tarefas rotineiras. Vamos explorar como o Python pode nos ajudar a superar essa tarefa sem dificuldades. Inicialmente, é importante entender por que Python é uma escolha acertada.
- Python é uma das linguagens mais populares para a automação de tarefas.
- Com Python, é possível realizar muito com pouco código, comparado a outras linguagens.
- Python é compatível com diversos sistemas operacionais, permitindo que o mesmo código seja executado em Windows, Linux e macOS.
- Python inclui um módulo chamado “os” que facilita a interação com o sistema operacional, o qual usaremos para automatizar a exclusão de arquivos.
Com Python, podemos automatizar qualquer tarefa de sistema repetitiva ou cansativa. Criar scripts para realizar tarefas específicas do sistema torna-se fácil se você tiver conhecimento em Python. Abaixo, examinaremos um caso prático.
Nota: As instruções a seguir foram testadas no Python 3.6 ou superior.
Removendo Arquivos/Pastas com Mais de X Dias
Com frequência, logs antigos tornam-se desnecessários e sua limpeza regular é crucial para liberar espaço de armazenamento. Isso se aplica a diversos tipos de arquivos, não apenas logs.
O módulo “os” oferece um método chamado “stat”, que fornece informações sobre o último acesso (st_atime), modificação (st_mtime) e alteração de metadados (st_ctime). Todos esses métodos retornam o tempo em segundos desde o “epoch”. Para mais detalhes sobre “epoch”, você pode pesquisar online.
Utilizaremos o método “os.walk(path)” para explorar as subpastas dentro de um diretório.
Siga os passos abaixo para escrever o código que remove arquivos/pastas com base em um número específico de dias.
- Importe os módulos “time”, “os” e “shutil”.
- Defina as variáveis para o caminho e número de dias.
- Converta o número de dias em segundos utilizando o método “time.time()”.
- Verifique se o caminho existe com o módulo “os.path.exists(path)”.
- Caso o caminho exista, obtenha a lista de arquivos e pastas, incluindo subpastas, com “os.walk(path)”, que retorna um gerador com pastas, arquivos e subpastas.
- Crie o caminho completo de arquivos e pastas usando “os.path.join()”.
- Obtenha o “ctime” com “os.stat(path)” e o atributo “st_ctime”.
- Compare o “ctime” com o tempo calculado.
- Se o resultado for maior que o tempo desejado pelo usuário, verifique se é um arquivo ou pasta. Para arquivos, use “os.remove(path)”, e para pastas, utilize “shutil.rmtree()”.
- Se o caminho não existir, exiba uma mensagem de “não encontrado”.
Vamos detalhar o código:
# importando os módulos necessários
import os
import shutil
import time
# função principal
def main():
# inicializando o contador
pastas_excluidas_contador = 0
arquivos_excluidos_contador = 0
# especifique o caminho
caminho = "/CAMINHO_PARA_EXCLUIR"
# especifique os dias
dias = 30
# convertendo dias em segundos
# time.time() retorna o tempo atual em segundos
segundos = time.time() - (dias * 24 * 60 * 60)
# verificando se o arquivo está presente no caminho ou não
if os.path.exists(caminho):
# iterando sobre cada pasta e arquivo no caminho
for pasta_raiz, pastas, arquivos in os.walk(caminho):
# comparando os dias
if segundos >= obter_idade_arquivo_pasta(pasta_raiz):
# removendo a pasta
remover_pasta(pasta_raiz)
pastas_excluidas_contador += 1 # incrementando o contador
# saindo após remover a pasta_raiz
break
else:
# verificando as pastas a partir da pasta_raiz
for pasta in pastas:
# caminho da pasta
caminho_pasta = os.path.join(pasta_raiz, pasta)
# comparando com os dias
if segundos >= obter_idade_arquivo_pasta(caminho_pasta):
# invocando a função remover_pasta
remover_pasta(caminho_pasta)
pastas_excluidas_contador += 1 # incrementando o contador
# verificando os arquivos do diretório atual
for arquivo in arquivos:
# caminho do arquivo
caminho_arquivo = os.path.join(pasta_raiz, arquivo)
# comparando os dias
if segundos >= obter_idade_arquivo_pasta(caminho_arquivo):
# invocando a função remover_arquivo
remover_arquivo(caminho_arquivo)
arquivos_excluidos_contador += 1 # incrementando o contador
else:
# se o caminho não for um diretório
# comparando com os dias
if segundos >= obter_idade_arquivo_pasta(caminho):
# invocando o arquivo
remover_arquivo(caminho)
arquivos_excluidos_contador += 1 # incrementando o contador
else:
# arquivo/pasta não encontrado
print(f'"{caminho}" não foi encontrado')
arquivos_excluidos_contador += 1 # incrementando o contador
print(f"Total de pastas excluídas: {pastas_excluidas_contador}")
print(f"Total de arquivos excluídos: {arquivos_excluidos_contador}")
def remover_pasta(caminho):
# removendo a pasta
if not shutil.rmtree(caminho):
# mensagem de sucesso
print(f"{caminho} foi removido com sucesso")
else:
# mensagem de falha
print(f"Não foi possível excluir {caminho}")
def remover_arquivo(caminho):
# removendo o arquivo
if not os.remove(caminho):
# mensagem de sucesso
print(f"{caminho} foi removido com sucesso")
else:
# mensagem de falha
print(f"Não foi possível excluir {caminho}")
def obter_idade_arquivo_pasta(caminho):
# obtendo ctime do arquivo/pasta
# o tempo estará em segundos
ctime = os.stat(caminho).st_ctime
# retornando o tempo
return ctime
if __name__ == '__main__':
main()
É preciso ajustar as seguintes duas variáveis no código de acordo com suas necessidades:
dias = 30 caminho = "/CAMINHO_PARA_EXCLUIR"
Removendo Arquivos Maiores que X GB
Agora, vamos buscar e excluir arquivos que excedem um determinado tamanho. Este script é semelhante ao anterior; em vez de usar a idade como critério, usaremos o tamanho.
# importando o módulo os
import os
# função que retorna o tamanho de um arquivo
def obter_tamanho_arquivo(caminho):
# obtendo o tamanho do arquivo em bytes
tamanho = os.path.getsize(caminho)
# retornando o tamanho do arquivo
return tamanho
# função para excluir um arquivo
def remover_arquivo(caminho):
# excluindo o arquivo
if not os.remove(caminho):
# sucesso
print(f"{caminho} foi excluído com sucesso")
else:
# erro
print(f"Não foi possível excluir {caminho}")
def main():
# especifique o caminho
caminho = "DIGITE_O_CAMINHO_AQUI"
# defina o tamanho máximo do arquivo em MBs
tamanho = 500
# verificando se o caminho existe ou não
if os.path.exists(caminho):
# convertendo tamanho para bytes
tamanho = tamanho * 1024 * 1024
# percorrendo as subpastas
for pasta_raiz, pastas, arquivos in os.walk(caminho):
# iterando sobre a lista de arquivos
for arquivo in arquivos:
# obtendo o caminho do arquivo
caminho_arquivo = os.path.join(pasta_raiz, arquivo)
# verificando o tamanho do arquivo
if obter_tamanho_arquivo(caminho_arquivo) >= tamanho:
# invocando a função remover_arquivo
remover_arquivo(caminho_arquivo)
else:
# verificando apenas se o caminho é um arquivo
if os.path.isfile(caminho):
# caminho não é um diretório
# verificando o arquivo diretamente
if obter_tamanho_arquivo(caminho) >= tamanho:
# invocando a função remover_arquivo
remover_arquivo(caminho)
else:
# caminho não existe
print(f"{caminho} não existe")
if __name__ == '__main__':
main()
Ajuste as duas variáveis seguintes:
caminho = "DIGITE_O_CAMINHO_AQUI" tamanho = 500
Removendo Arquivos com uma Extensão Específica
Pode ser necessário excluir arquivos com base em seus tipos de extensão, por exemplo, arquivos “.log”. É possível encontrar a extensão usando o método “os.path.splitext(path)”, que retorna uma tupla com o caminho e a extensão do arquivo.
# importando o módulo os
import os
# função principal
def main():
# especifique o caminho
caminho = "CAMINHO_PARA_PROCURAR"
# especifique a extensão
extensao = ".log"
# verificando se o caminho existe ou não
if os.path.exists(caminho):
# verificando se o caminho é um diretório ou não
if os.path.isdir(caminho):
# iterando através das subpastas
for pasta_raiz, pastas, arquivos in os.walk(caminho):
# verificando os arquivos
for arquivo in arquivos:
# caminho do arquivo
caminho_arquivo = os.path.join(pasta_raiz, arquivo)
# extraindo a extensão do nome do arquivo
extensao_arquivo = os.path.splitext(caminho_arquivo)[1]
# verificando a extensão_arquivo
if extensao == extensao_arquivo:
# excluindo o arquivo
if not os.remove(caminho_arquivo):
# mensagem de sucesso
print(f"{caminho_arquivo} excluído com sucesso")
else:
# mensagem de falha
print(f"Não foi possível excluir {caminho_arquivo}")
else:
# caminho não é um diretório
print(f"{caminho} não é um diretório")
else:
# caminho não existe
print(f"{caminho} não existe")
if __name__ == '__main__':
# invocando a função main
main()
Lembre-se de ajustar o caminho e a variável de extensão no código acima para atender suas necessidades.
Recomendo testar esses scripts em um ambiente de NÃO PRODUÇÃO. Ao estar satisfeito com os resultados, você pode agendá-los com o “cron” (para Linux) para execução periódica em trabalhos de manutenção. Python é uma ferramenta poderosa para essas tarefas. Se você tiver interesse em aprender mais, considere este Curso Udemy.
Gostou do artigo? Compartilhe com seus colegas!