Python-skript för att radera filerna regelbundet

By rik

Det är ineffektivt att manuellt städa upp filsystemet. Låt oss automatisera den processen istället!

Att hantera filraderingar och mapphantering manuellt är en tråkig uppgift, trots vad man kanske tror. Därför är det fördelaktigt att automatisera dessa steg.

Här kommer Python in i bilden som ett verktyg för att förenkla våra liv. Python är ett idealiskt skriptspråk för den här typen av uppgifter. Vi kommer att använda Python för att utföra vår uppgift utan problem. Först bör vi se varför Python är ett bra val.

  • Python är ett populärt språk för att automatisera uppgifter.
  • Kräver mindre kod jämfört med många andra programmeringsspråk.
  • Python är kompatibelt med olika operativsystem, vilket gör det möjligt att använda samma kod i Windows, Linux och macOS.
  • Python har en modul kallad ”os” som tillåter oss att interagera med operativsystemet. Vi kommer att utnyttja den här modulen för att automatisera vår filhantering.

Python kan ersätta alla irriterande eller repetitiva systemuppgifter. Att skriva skript för att automatisera en specifik systemuppgift är enkelt om du kan Python. Låt oss kolla på några exempel.

Obs: Kodexemplen är testade med Python 3.6 eller senare versioner.

Ta bort filer/mappar som är äldre än X dagar

Ofta finns det ett behov av att rensa ut gamla loggfiler för att spara diskutrymme. Detta kan vara fallet för andra typer av filer än loggar.

OS-modulen tillhandahåller en metod som heter ”stat” som ger information om senaste åtkomsttid (st_atime), modifieringstid (st_mtime) och metadatamodifieringstid (st_ctime). Dessa metoder returnerar tider i sekunder från epoken. Du kan hitta mer information om epoken här.

Vi kommer också använda ”os.walk(path)” för att iterera genom undermappar till en viss mapp.

Följ dessa steg för att skriva kod som raderar filer och mappar baserat på deras ålder:

  • Importera modulerna ”time”, ”os” och ”shutil”.
  • Definiera sökvägen och åldern (i dagar) som variabler.
  • Konvertera antalet dagar till sekunder med hjälp av ”time.time()”.
  • Kontrollera om sökvägen existerar med ”os.path.exists(path)”.
  • Om sökvägen finns, hämta listan över filer och mappar, inklusive undermappar, genom att använda ”os.walk(path)”. Denna funktion returnerar en generator med mappar, filer och undermappar.
  • Generera den fullständiga sökvägen för varje fil/mapp med ”os.path.join()”.
  • Hämta ctime från ”os.stat(path)” med attributet ”st_ctime”.
  • Jämför ctime med den beräknade tidsgränsen.
  • Om filens/mappens ålder överskrider gränsen, kolla om det är en fil eller mapp. Använd ”os.remove(path)” för filer och ”shutil.rmtree()” för mappar.
  • Om sökvägen inte existerar, visa ett felmeddelande.

Här är koden i detalj:

    
# Importera nödvändiga moduler
import os
import shutil
import time

# Huvudfunktion
def main():

    # Initiera räknare
    deleted_folders_count = 0
    deleted_files_count = 0

    # Ange sökväg
    path = "/PATH_ATT_RADERA"

    # Ange ålder i dagar
    days = 30

    # Konvertera dagar till sekunder
    seconds = time.time() - (days * 24 * 60 * 60)

    # Kontrollera om sökvägen existerar
    if os.path.exists(path):
        
        # Iterera genom alla mappar och filer
        for root_folder, folders, files in os.walk(path):

            # Jämför ålder
            if seconds >= get_file_or_folder_age(root_folder):

                # Radera mappen
                remove_folder(root_folder)
                deleted_folders_count += 1 # Öka räknaren

                # Avsluta efter radering av rotmappen
                break

            else:

                # Kontrollera mappar i rotmappen
                for folder in folders:

                    # Mappsökväg
                    folder_path = os.path.join(root_folder, folder)

                    # Jämför ålder
                    if seconds >= get_file_or_folder_age(folder_path):

                        # Anropa raderingsfunktionen
                        remove_folder(folder_path)
                        deleted_folders_count += 1 # Öka räknaren


                # Kontrollera filer i nuvarande mapp
                for file in files:

                    # Filsökväg
                    file_path = os.path.join(root_folder, file)

                    # Jämför ålder
                    if seconds >= get_file_or_folder_age(file_path):

                        # Anropa raderingsfunktionen
                        remove_file(file_path)
                        deleted_files_count += 1 # Öka räknaren

        else:

            # Om sökvägen inte är en mapp
            if seconds >= get_file_or_folder_age(path):
                
                # Anropa raderingsfunktionen för filen
                remove_file(path)
                deleted_files_count += 1 # Öka räknaren

    else:
        # Fil/mapp hittades inte
        print(f'"{path}" hittades inte')
        deleted_files_count += 1 # Öka räknaren

    print(f"Antal raderade mappar: {deleted_folders_count}")
    print(f"Antal raderade filer: {deleted_files_count}")


def remove_folder(path):

    # Raderar mappen
    if not shutil.rmtree(path):
        # Lyckat meddelande
        print(f"{path} raderades")

    else:
        # Felmeddelande
        print(f"Kunde inte radera {path}")


def remove_file(path):
    # Raderar filen
    if not os.remove(path):
        # Lyckat meddelande
        print(f"{path} raderades")
    else:
        # Felmeddelande
        print(f"Kunde inte radera {path}")


def get_file_or_folder_age(path):
    # Hämta ctime för filen/mappen
    ctime = os.stat(path).st_ctime
    # Returnerar tiden
    return ctime


if __name__ == '__main__':
    main()
    
  

Anpassa variablerna nedan i koden baserat på dina behov:

days = 30 
path = "/PATH_ATT_RADERA"

Ta bort filer som är större än X GB

Låt oss hitta filer som överskrider en viss storlek och ta bort dem. Detta skript liknar det ovanstående, men istället för ålder, använder vi storlek som parameter.

    
# Importera os modulen
import os

# Funktion för att hämta filstorlek
def get_file_size(path):
    # Hämta filstorlek i bytes
    size = os.path.getsize(path)
    # Returnera filstorlek
    return size

# Funktion för att radera en fil
def remove_file(path):
    # Raderar filen
    if not os.remove(path):
        # Lyckat
        print(f"{path} raderades")
    else:
        # Fel
        print(f"Kunde inte radera {path}")

def main():
    # Ange sökväg
    path = "ANGE_SÖKVÄG_HÄR"
    # Ange max filstorlek i MB
    size = 500
    # Kontrollera om sökvägen existerar
    if os.path.exists(path):
        # Konvertera storlek till bytes
        size = size * 1024 * 1024
        # Iterera genom undermappar
        for root_folder, folders, files in os.walk(path):
            # Iterera genom filerna
            for file in files:
                # Hämta filsökväg
                file_path = os.path.join(root_folder, file)
                # Kontrollera filstorlek
                if get_file_size(file_path) >= size:
                    # Anropa remove_file funktionen
                    remove_file(file_path)
        else:
            # Kontrollera om sökvägen är en fil
            if os.path.isfile(path):
                # Sökvägen är inte en mapp
                if get_file_size(path) >= size:
                    # Anropa remove_file funktionen
                    remove_file(path)
    else:
        # Sökvägen existerar inte
        print(f"{path} existerar inte")

if __name__ == '__main__':
    main()
    
  

Anpassa de två variablerna nedan:

path = "ANGE_SÖKVÄG_HÄR" 
size = 500

Ta bort filer med en specifik filändelse

Ibland kan du vilja radera filer baserat på deras filändelse, till exempel .log filer. Vi kan hitta filändelsen med ”os.path.splitext(path)”, som returnerar en tuple med sökväg och filändelse.

    
# Importera os modulen
import os

# Huvudfunktion
def main():
    # Ange sökväg
    path = "SÖKVÄG_ATT_LETA_I"
    # Ange filändelse
    extension = ".log"
    # Kontrollera om sökvägen existerar
    if os.path.exists(path):
        # Kontrollera om sökvägen är en mapp
        if os.path.isdir(path):
            # Iterera genom undermappar
            for root_folder, folders, files in os.walk(path):
                # Kontrollera filerna
                for file in files:
                    # Filsökväg
                    file_path = os.path.join(root_folder, file)
                    # Extrahera filändelse
                    file_extension = os.path.splitext(file_path)[1]
                    # Kontrollera filändelsen
                    if extension == file_extension:
                        # Raderar filen
                        if not os.remove(file_path):
                            # Lyckat meddelande
                            print(f"{file_path} raderades")
                        else:
                            # Felmeddelande
                            print(f"Kunde inte radera {file_path}")
        else:
            # Sökvägen är inte en mapp
            print(f"{path} är inte en mapp")
    else:
        # Sökvägen existerar inte
        print(f"{path} existerar inte")
        
if __name__ == '__main__':
    # Anropa huvudfunktionen
    main()
    
  

Kom ihåg att uppdatera sökvägen och filändelsen för att passa dina behov.

Jag rekommenderar att du testar dessa skript i en icke-produktionsmiljö. När du är nöjd med resultatet, kan du schemalägga dem med cron (om du använder Linux) för regelbunden filhantering. Python är mycket effektivt för detta, och om du är intresserad av att lära dig mer, kolla in denna Udemy kurs.

Tyckte du om den här artikeln? Dela gärna den med andra!