Secuencias de comandos de Python para eliminar los archivos con regularidad
Limpiar el sistema de archivos periódicamente manually no es bueno. automáticoate ¡ellos!
Eliminar archivos y carpetas manually No es una tarea apasionante, como podría pensarse. Tiene sentido automatizarate de ellas.
Aquí viene Python para hacernos la vida más fácil. Python es un excelente lenguaje de programación para secuencias de comandos. Vamos a aprovechar Python para terminar nuestra tarea sin ningún obstáculo. Primero, debes saber por qué Python es una buena opción.
- Python es un lenguaje favorito de todos los tiempos para automatizar tareas
- Menos código en comparación con otros lenguajes de programación
- Python es compatible con todos los sistemas operativos. Puedes ejecutar el mismo código en Windows, Linux y Mac.
- Python tiene un módulo llamado
os
que nos ayuda a interactuar con el sistema operativo. Usaremos este módulo para completar nuestra automatización de eliminar los archivos.
Podemos reemplazar cualquier tarea del sistema molesta o repetitiva usando Python. Escribir guiones para completar una tarea específica del sistema es una tazacake si conoces Python. Veamos el siguiente caso de uso.
Nota: lo siguiente se prueba en Python 3.6+
Eliminar archivos / carpetas de más de X días
A menudo, no necesita troncos viejos y debe limpiarlos con regularidad para que el almacenamiento esté disponible. Puede ser cualquier cosa y no solo registros.
Tenemos un método llamado stat
existentes os
módulo que da detalles del último acceso (st_atime), modificación (st_mtime), y modificación de metadatos (st_ctime) tiempo. Todos los métodos devuelven el tiempo en segundos desde la época. Puedes encontrar más detalles sobre la época aquí.
Usaremos un método llamado os.walk(path)
para recorrer las subcarpetas de una carpeta.
Siga los pasos a continuación para escribir código para los archivos / carpetas de eliminación según el número de días.
- Importar los módulos tiempo, os, shutil
- Establecer la ruta y los días a las variables
- Convierta la cantidad de días en segundos usando tiempo tiempo() Método
- Compruebe si la ruta existe o no utilizando el os.path.exists (ruta) módulo
- Si la ruta existe, obtenga la lista de archivos y carpetas presentes en la ruta, incluidas las subcarpetas. Usa el método os.walk (camino), y devolverá un generador que contiene carpetas, archivos y subcarpetas
- Obtenga la ruta del archivo o carpeta uniendo la ruta actual y el nombre del archivo / carpeta usando el método os.path.join ()
- OBTÉN LO ctime del desplegable os.stat (ruta) método usando el atributo st_ctime
- Compara el ctime con el tiempo tenemos cálculoatedpreviosamente
- Si el resultado es greater que los días deseados del usuario, luego verifique si es un archivo o carpeta. Si es un archivo, utilice el os.remove (ruta) si no usa el shutil.rmtree () Método
- Si la ruta no existe, imprima el mensaje no encontrado
Veamos el código en detalle.
# importing the required modules
import os
import shutil
import time
# main function
def main():
# initializing the count
deleted_folders_count = 0
deleted_files_count = 0
# specify the path
path = "/PATH_TO_DELETE"
# specify the days
days = 30
# converting days to seconds
# time.time() returns current time in seconds
seconds = time.time() - (days * 24 * 60 * 60)
# checking whether the file is present in path or not
if os.path.exists(path):
# iterating over each and every folder and file in the path
for root_folder, folders, files in os.walk(path):
# comparing the days
if seconds >= get_file_or_folder_age(root_folder):
# removing the folder
remove_folder(root_folder)
deleted_folders_count += 1 # incrementing count
# breaking after removing the root_folder
break
else:
# checking folder from the root_folder
for folder in folders:
# folder path
folder_path = os.path.join(root_folder, folder)
# comparing with the days
if seconds >= get_file_or_folder_age(folder_path):
# invoking the remove_folder function
remove_folder(folder_path)
deleted_folders_count += 1 # incrementing count
# checking the current directory files
for file in files:
# file path
file_path = os.path.join(root_folder, file)
# comparing the days
if seconds >= get_file_or_folder_age(file_path):
# invoking the remove_file function
remove_file(file_path)
deleted_files_count += 1 # incrementing count
else:
# if the path is not a directory
# comparing with the days
if seconds >= get_file_or_folder_age(path):
# invoking the file
remove_file(path)
deleted_files_count += 1 # incrementing count
else:
# file/folder is not found
print(f'"{path}" is not found')
deleted_files_count += 1 # incrementing count
print(f"Total folders deleted: {deleted_folders_count}")
print(f"Total files deleted: {deleted_files_count}")
def remove_folder(path):
# removing the folder
if not shutil.rmtree(path):
# success message
print(f"{path} is removed successfully")
else:
# failure message
print(f"Unable to delete the {path}")
def remove_file(path):
# removing the file
if not os.remove(path):
# success message
print(f"{path} is removed successfully")
else:
# failure message
print(f"Unable to delete the {path}")
def get_file_or_folder_age(path):
# getting ctime of the file/folder
# time will be in seconds
ctime = os.stat(path).st_ctime
# returning the time
return ctime
if __name__ == '__main__':
main()
Debe ajustar las siguientes dos variables en el código anterior según el requisito.
days = 30
path = "/PATH_TO_DELETE"
Eliminar archivos de más de X GB
Busquemos los archivos que sean más grandes que un tamaño particular y eliminémoslos. Es similar al script anterior. En la prevguión ious, hemos tomado edad como parámetro, y ahora tomaremos tamaño como parámetro para la eliminación.
# importing the os module
import os
# function that returns size of a file
def get_file_size(path):
# getting file size in bytes
size = os.path.getsize(path)
# returning the size of the file
return size
# function to delete a file
def remove_file(path):
# deleting the file
if not os.remove(path):
# success
print(f"{path} is deleted successfully")
else:
# error
print(f"Unable to delete the {path}")
def main():
# specify the path
path = "ENTER_PATH_HERE"
# put max size of file in MBs
size = 500
# checking whether the path exists or not
if os.path.exists(path):
# converting size to bytes
size = size * 1024 * 1024
# traversing through the subfolders
for root_folder, folders, files in os.walk(path):
# iterating over the files list
for file in files:
# getting file path
file_path = os.path.join(root_folder, file)
# checking the file size
if get_file_size(file_path) >= size:
# invoking the remove_file function
remove_file(file_path)
else:
# checking only if the path is file
if os.path.isfile(path):
# path is not a dir
# checking the file directly
if get_file_size(path) >= size:
# invoking the remove_file function
remove_file(path)
else:
# path doesn't exist
print(f"{path} doesn't exist")
if __name__ == '__main__':
main()
Ajuste las siguientes dos variables.
path = "ENTER_PATH_HERE"
size = 500
Eliminar archivos con una extensión específica
Puede haber un escenario en el que desee eliminar archivos por sus tipos de extensión. Digamos .log
expediente. Podemos encontrar la extensión de un archivo usando el os.path.splitext(path)
método. Devuelve una tupla que contiene la ruta y la extensión del archivo.
# importing os module
import os
# main function
def main():
# specify the path
path = "PATH_TO_LOOK_FOR"
# specify the extension
extension = ".log"
# checking whether the path exist or not
if os.path.exists(path):
# check whether the path is directory or not
if os.path.isdir(path):
# iterating through the subfolders
for root_folder, folders, files in os.walk(path):
# checking of the files
for file in files:
# file path
file_path = os.path.join(root_folder, file)
# extracting the extension from the filename
file_extension = os.path.splitext(file_path)[1]
# checking the file_extension
if extension == file_extension:
# deleting the file
if not os.remove(file_path):
# success message
print(f"{file_path} deleted successfully")
else:
# failure message
print(f"Unable to delete the {file_path}")
else:
# path is not a directory
print(f"{path} is not a directory")
else:
# path doen't exist
print(f"{path} doesn't exist")
if __name__ == '__main__':
# invoking main function
main()
No olvides actualizarate la ruta y la variable de extensión en el código anterior para cumplir con sus requisitos.
Sugeriría probar los scripts en el entorno NO PRODUCCIÓN. Una vez que esté satisfecho con los resultados, puede programar cron (si usa Linux) para ejecutarlo periódicamenteally para trabajos de mantenimiento. Python es excelente para lograr esto y si está interesado en aprender a hacer más, consulte esto. Curso Udemy.