Limpiar el sistema de archivos regularmente de forma manual no es bueno. ¡Automatízalos!
Eliminar archivos y carpetas manualmente no es una tarea emocionante, como se puede pensar. Tiene sentido automatizarlos.
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, debe 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. Puede 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. Vamos a utilizar este módulo para completar nuestra automatización de eliminación de archivos.
Podemos reemplazar cualquier tarea del sistema molesta o repetitiva usando Python. Escribir scripts para completar una tarea específica del sistema es pan comido si conoce Python. Veamos el siguiente caso de uso.
Nota: lo siguiente se prueba en Python 3.6+
Tabla de contenido
Eliminar archivos/carpetas con más de X días
A menudo, no necesita registros antiguos y necesita limpiarlos regularmente para que el almacenamiento esté disponible. Podría ser cualquier cosa y no solo registros.
Tenemos un método llamado stat en el módulo os que brinda detalles del último acceso (st_atime), modificación (st_mtime) y modificación de metadatos (st_ctime). 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(ruta) para recorrer las subcarpetas de una carpeta.
Siga los pasos a continuación para escribir el código para los archivos/carpetas de eliminación según la cantidad de días.
- Importar los módulos time, os, shutil
- Establecer la ruta y los días a las variables.
- Convierta la cantidad de días en segundos usando el método time.time()
- Verifique si la ruta existe o no usando el módulo os.path.exists (ruta)
- Si la ruta existe, obtenga la lista de archivos y carpetas presentes en la ruta, incluidas las subcarpetas. Use el método os.walk(ruta), y devolverá un generador que contiene carpetas, archivos y subcarpetas
- Obtenga la ruta del archivo o carpeta uniendo tanto la ruta actual como el nombre del archivo/carpeta usando el método os.path.join()
- Obtenga el ctime del método os.stat(ruta) usando el atributo st_ctime
- Compara el ctime con el tiempo que hemos calculado anteriormente
- Si el resultado es mayor que los días deseados por el usuario, verifique si se trata de un archivo o una carpeta. Si es un archivo, use os.remove(ruta) o use el método shutil.rmtree()
- Si la ruta no existe, imprima el mensaje de 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 son más grandes que un tamaño particular y eliminémoslos. Es similar al script anterior. En el script anterior, hemos tomado la edad como parámetro, y ahora tomaremos el 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 archivo .log. Podemos encontrar la extensión de un archivo usando el método os.path.splitext(path). 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 olvide actualizar la variable de ruta y 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 a través de cron (si usa Linux) para ejecutarlo periódicamente para el trabajo de mantenimiento. Python es excelente para lograr estas cosas y si está interesado en aprender a hacer más, consulte esto Curso de Udemy.
¿Te gustó leer el artículo? ¿Qué tal compartir con el mundo?