Gestionarea manuală și frecventă a sistemului de fișiere nu este o abordare optimă. Este mai eficient să automatizăm aceste procese!
Eliminarea fișierelor și a directoarelor în mod manual nu este o sarcină plină de entuziasm. De aceea, automatizarea ei devine o soluție logică.
Aici intervine Python, un limbaj de programare perfect pentru scripting, gata să ne simplifice viața. Vom utiliza Python pentru a duce la îndeplinire această sarcină fără dificultăți. Mai întâi, este important să înțelegem de ce Python este o alegere ideală:
- Python este preferat de mulți pentru automatizarea sarcinilor.
- Scrie un cod mai concis în comparație cu alte limbaje.
- Este compatibil cu toate sistemele de operare majore (Windows, Linux, macOS), permițând rularea aceluiași cod pe diferite platforme.
- Python include un modul numit „os” care facilitează interacțiunea cu sistemul de operare. Acesta va fi crucial în automatizarea ștergerii fișierelor.
Python oferă soluții eficiente pentru a înlocui sarcinile de sistem monotone și repetitive. Crearea de scripturi pentru a automatiza anumite acțiuni de sistem este o operațiune simplă, mai ales dacă deții cunoștințe de Python. Să analizăm un exemplu practic:
Notă: exemplele de cod prezentate sunt testate cu Python 3.6+
Ștergerea fișierelor/directoarelor mai vechi de un anumit număr de zile
Deseori, fișierele vechi de tip jurnal (log) devin inutile și trebuie șterse periodic pentru a elibera spațiu de stocare. Acesta este doar un exemplu, conceptul se aplică și altor tipuri de fișiere.
Modulul „os” include o metodă numită „stat” care oferă informații detaliate despre data ultimului acces (st_atime), data ultimei modificări (st_mtime) și data modificării metadatelor (st_ctime). Toate aceste metode returnează timpul exprimat în secunde de la „epocă” (mai multe informații despre „epocă” se găsesc aici).
Pentru a parcurge subdirectoarele, vom utiliza metoda „os.walk(path)”.
Pașii necesari pentru scrierea unui cod care șterge fișierele sau directoarele pe baza vechimii (număr de zile) sunt:
- Importă modulele necesare: time, os, și shutil.
- Definește calea și numărul de zile ca variabile.
- Transformă numărul de zile în secunde folosind funcția time.time().
- Verifică dacă există calea specificată folosind os.path.exists(path).
- Dacă calea este validă, obține lista de fișiere și directoare, incluzând subdirectoarele, folosind metoda os.walk(path).
- Pentru fiecare fișier/director, construiește calea completă folosind os.path.join().
- Extrage timpul de creare (ctime) al fișierului/directorului folosind os.stat(path).st_ctime.
- Compară ctime cu timpul calculat anterior.
- Dacă ctime este mai vechi decât intervalul dorit, verifică dacă este un fișier sau un director. În cazul unui fișier, utilizează os.remove(path), iar pentru un director, utilizează shutil.rmtree().
- Dacă calea nu există, afișează un mesaj corespunzător.
Să analizăm codul în detaliu:
# importarea modulelor necesare
import os
import shutil
import time
# functia principala
def main():
# initializarea contoarelor
deleted_folders_count = 0
deleted_files_count = 0
# specificarea caii
path = "/CALEA_DE_STERS"
# specificarea numarului de zile
days = 30
# transformarea zilelor in secunde
# time.time() returneaza timpul curent in secunde
seconds = time.time() - (days * 24 * 60 * 60)
# verificarea daca calea exista
if os.path.exists(path):
# parcurgerea fiecarui folder si fisier
for root_folder, folders, files in os.walk(path):
# compararea zilelor
if seconds >= get_file_or_folder_age(root_folder):
# stergerea folderului
remove_folder(root_folder)
deleted_folders_count += 1 # incrementarea contorului
# oprirea dupa stergerea folderului radacina
break
else:
# verificarea folderelor din folderul radacina
for folder in folders:
# calea folderului
folder_path = os.path.join(root_folder, folder)
# compararea cu zilele
if seconds >= get_file_or_folder_age(folder_path):
# invocarea functiei remove_folder
remove_folder(folder_path)
deleted_folders_count += 1 # incrementarea contorului
# verificarea fisierelor din directorul curent
for file in files:
# calea fisierului
file_path = os.path.join(root_folder, file)
# compararea cu zilele
if seconds >= get_file_or_folder_age(file_path):
# invocarea functiei remove_file
remove_file(file_path)
deleted_files_count += 1 # incrementarea contorului
else:
# daca calea nu e un director
# compararea cu zilele
if seconds >= get_file_or_folder_age(path):
#invocarea functiei de stergere fisier
remove_file(path)
deleted_files_count += 1 #incrementarea contorului
# daca calea nu exista
else:
print(f'"{path}" nu a fost gasit')
deleted_files_count += 1 # incrementarea contorului
print(f"Total foldere sterse: {deleted_folders_count}")
print(f"Total fisiere sterse: {deleted_files_count}")
def remove_folder(path):
# stergerea folderului
if not shutil.rmtree(path):
# mesaj de succes
print(f"{path} a fost sters cu succes")
else:
# mesaj de eroare
print(f"Nu s-a putut sterge {path}")
def remove_file(path):
# stergerea fisierului
if not os.remove(path):
# mesaj de succes
print(f"{path} a fost sters cu succes")
else:
# mesaj de eroare
print(f"Nu s-a putut sterge {path}")
def get_file_or_folder_age(path):
# obtinerea ctime-ului fisierului sau folderului
# timpul va fi in secunde
ctime = os.stat(path).st_ctime
# returnarea timpului
return ctime
if __name__ == '__main__':
main()
Pentru a personaliza scriptul, trebuie să ajustați următoarele variabile:
days = 30 path = "/CALEA_DE_STERS"
Ștergerea fișierelor mai mari de o anumită dimensiune (X GB)
Acum, să identificăm și să ștergem fișierele care depășesc o anumită dimensiune. Scriptul de bază este similar cu cel anterior, doar că acum dimensiunea înlocuiește vechimea ca parametru de ștergere.
# importarea modulului os
import os
# functie care returneaza dimensiunea unui fisier
def get_file_size(path):
# obtinerea dimensiunii fisierului in bytes
size = os.path.getsize(path)
# returnarea dimensiunii fisierului
return size
# functie de stergere a unui fisier
def remove_file(path):
# stergerea fisierului
if not os.remove(path):
# succes
print(f"{path} a fost sters cu succes")
else:
# eroare
print(f"Nu s-a putut sterge {path}")
def main():
# specificarea caii
path = "INTRODUCETI_CALEA_AICI"
# specificarea dimensiunii maxime a fisierului in MB
size = 500
# verificarea existentei caii
if os.path.exists(path):
# transformarea dimensiunii in bytes
size = size * 1024 * 1024
# parcurgerea subfolderelor
for root_folder, folders, files in os.walk(path):
# parcurgerea listei de fisiere
for file in files:
# obtinerea caii fisierului
file_path = os.path.join(root_folder, file)
# verificarea dimensiunii fisierului
if get_file_size(file_path) >= size:
# invocarea functiei de stergere fisier
remove_file(file_path)
else:
#verificam doar daca calea este fisier
if os.path.isfile(path):
# calea nu e un director
# verificarea fisierului direct
if get_file_size(path) >= size:
#invocarea functiei de stergere fisier
remove_file(path)
else:
# calea nu exista
print(f"{path} nu exista")
if __name__ == '__main__':
main()
Personalizați următoarele variabile:
path = "INTRODUCETI_CALEA_AICI" size = 500
Ștergerea fișierelor după extensie
În unele cazuri, poate fi necesară ștergerea fișierelor în funcție de tipul lor (extensie), de exemplu fișierele .log. Pentru a identifica extensia unui fișier, putem folosi metoda os.path.splitext(path), care returnează un tuplu format din cale și extensie.
# importarea modulului os
import os
# functia principala
def main():
# specificarea caii
path = "CALEA_DE_CAUTARE"
# specificarea extensiei
extension = ".log"
# verificarea existentei caii
if os.path.exists(path):
# verificarea daca calea este un director
if os.path.isdir(path):
# parcurgerea subfolderelor
for root_folder, folders, files in os.walk(path):
# verificarea fisierelor
for file in files:
# calea fisierului
file_path = os.path.join(root_folder, file)
# extragerea extensiei din numele fisierului
file_extension = os.path.splitext(file_path)[1]
# verificarea extensiei fisierului
if extension == file_extension:
# stergerea fisierului
if not os.remove(file_path):
# mesaj de succes
print(f"{file_path} a fost sters cu succes")
else:
# mesaj de eroare
print(f"Nu s-a putut sterge {file_path}")
else:
# calea nu este un director
print(f"{path} nu este un director")
else:
# calea nu exista
print(f"{path} nu exista")
if __name__ == '__main__':
#invocarea functiei main
main()
Nu uita să actualizezi variabilele „path” și „extension” în codul de mai sus, pentru a corespunde cerințelor tale.
Recomand testarea scripturilor într-un mediu NON-PRODUCȚIE. Odată ce rezultatele sunt satisfăcătoare, poți utiliza cron (în Linux) pentru a programa execuția scripturilor la intervale regulate pentru operațiuni de mentenanță. Python este un instrument excelent pentru aceste tipuri de sarcini. Dacă dorești să aprofundezi cunoștințele, poți consulta acest Curs Udemy.
Ți-a plăcut articolul? Împărtășește-l cu alții!