Scripturi Python pentru a șterge fișierele în mod regulat

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!