Curățarea regulată manuală a sistemului de fișiere nu este bună. Automatizează-le!
Ștergerea manuală a fișierelor și folderelor nu este o sarcină interesantă, așa cum se poate crede. Are sens să le automatizezi.
Aici vine Python pentru a ne ușura viața. Python este un limbaj de programare excelent pentru scripting. Vom profita de Python pentru a ne termina sarcina fără niciun obstacol. În primul rând, ar trebui să știți de ce Python este o alegere bună.
- Python este un limbaj preferat din toate timpurile pentru automatizarea sarcinilor
- Mai puțin cod în comparație cu alte limbaje de programare
- Python este compatibil cu toate sistemele de operare. Puteți rula același cod în Windows, Linux și Mac.
- Python are un modul numit os care ne ajută să interacționăm cu sistemul de operare. Vom folosi acest modul pentru a finaliza automatizarea ștergerii fișierelor.
Putem înlocui orice sarcini de sistem enervante sau repetitive folosind Python. Scrierea de scripturi pentru a finaliza o anumită sarcină de sistem este un cupcake dacă cunoașteți Python. Să ne uităm la următorul caz de utilizare.
Notă: următoarele sunt testate pe Python 3.6+
Cuprins
Se elimină fișierele/folderele mai vechi de X zile
Adesea nu aveți nevoie de bușteni vechi și trebuie să le curățați în mod regulat pentru a face spațiu de stocare disponibil. Ar putea fi orice și nu doar bușteni.
Avem o metodă numită stat în modulul os, care oferă detalii despre ultimul acces (st_atime), modificarea (st_mtime) și timpul de modificare a metadatelor (st_ctime). Toate metodele returnează timpul în secunde de la epocă. Mai multe detalii despre epocă găsiți aici.
Vom folosi o metodă numită os.walk(path) pentru a parcurge subfolderele unui folder.
Urmați pașii de mai jos pentru a scrie codul pentru fișierele/folderele de ștergere în funcție de numărul de zile.
- Importă modulele time, os, shutil
- Setați calea și zilele la variabile
- Convertiți numărul de zile în secunde folosind metoda time.time().
- Verificați dacă calea există sau nu folosind modulul os.path.exists(path).
- Dacă calea există, atunci obțineți lista fișierelor și folderelor prezente în cale, inclusiv subfolderele. Utilizați metoda os.walk(cale) și va returna un generator care conține foldere, fișiere și subdosare
- Obțineți calea fișierului sau a folderului unind atât calea curentă, cât și numele fișierului/dosarului folosind metoda os.path.join()
- Obțineți ctime din metoda os.stat(path) folosind atributul st_ctime
- Comparați ctime cu timpul pe care l-am calculat anterior
- Dacă rezultatul este mai mare decât zilele dorite de utilizator, atunci verificați dacă este un fișier sau un folder. Dacă este un fișier, utilizați os.remove(cale) altfel utilizați metoda shutil.rmtree()
- Dacă calea nu există, imprimați mesajul negăsit
Să vedem codul în detaliu.
# 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()
Trebuie să ajustați următoarele două variabile din codul de mai sus în funcție de cerință.
days = 30 path = "/PATH_TO_DELETE"
Se elimină fișiere mai mari de X GB
Să căutăm fișierele care sunt mai mari decât o anumită dimensiune și să le ștergem. Este similar cu scriptul de mai sus. În scriptul anterior, am luat vârsta ca parametru, iar acum vom lua dimensiunea ca parametru pentru ștergere.
# 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()
Ajustați următoarele două variabile.
path = "ENTER_PATH_HERE" size = 500
Eliminarea fișierelor cu o anumită extensie
S-ar putea să existe un scenariu în care doriți să ștergeți fișierele după tipurile lor de extensii. Să spunem fișierul .log. Putem găsi extensia unui fișier folosind metoda os.path.splitext(path). Returnează un tuplu care conține calea și extensia fișierului.
# 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()
Nu uitați să actualizați calea și variabila extensie din codul de mai sus pentru a vă îndeplini cerințele.
Aș sugera testarea scripturilor în mediul NON PRODUCTION. Odată ce sunteți mulțumit de rezultate, puteți programa prin cron (dacă utilizați Linux) să îl rulați periodic pentru lucrări de întreținere. Python este grozav pentru a realiza aceste lucruri și, dacă sunteți interesat să învățați să faceți mai multe, verificați acest lucru Curs Udemy.
Ți-a plăcut să citești articolul? Ce zici de împărtășirea cu lumea?