Automatisert filsystemrydding med Python: Slett filer effektivt!

Å rutinemessig rydde opp i filsystemet manuelt er en kjedelig og ineffektiv oppgave. Det er mye bedre å automatisere denne prosessen.

Manuell sletting av filer og mapper er sjelden givende, og det er derfor en god idé å automatisere dette.

Python er et fantastisk verktøy som kan gjøre livet enklere. Det er et kraftig programmeringsspråk for skripting, og vi skal bruke det til å effektivt løse denne oppgaven. Før vi går i gang, la oss se hvorfor Python er et godt valg for dette.

  • Python er et allsidig språk for automatisering av rutineoppgaver.
  • Det krever mindre kode sammenlignet med mange andre programmeringsspråk.
  • Python er kompatibelt med de fleste operativsystemer som Windows, Linux og macOS, slik at samme kode kan kjøres på tvers av plattformer.
  • Python har en modul kalt os som gir grensesnitt til operativsystemet. Vi skal bruke denne modulen for å automatisere sletting av filer og mapper.

Med Python kan vi automatisere alle de repeterende systemoppgavene som er irriterende å gjøre manuelt. Å skrive skript for å utføre spesifikke systemoppgaver er enkelt om du behersker Python. La oss ta en titt på et par eksempler.

Merk: Eksemplene er testet med Python 3.6 og nyere.

Fjerning av filer/mapper eldre enn et gitt antall dager

Det er ofte behov for å fjerne gamle loggfiler eller andre filer for å frigjøre lagringsplass.

os-modulen inneholder metoden stat som returnerer detaljer om filens siste tilgangstid (st_atime), endringstid (st_mtime) og metadata endringstid (st_ctime). Disse metodene returnerer tid i sekunder siden epoken. Du finner mer informasjon om epoken her.

Vi skal også bruke metoden os.walk(path) som lar oss gå gjennom undermapper i en gitt mappe.

Følg disse stegene for å skrive kode som sletter filer og mapper basert på alder:

  • Importer modulene time, os og shutil.
  • Definer variabeler for stien og antall dager.
  • Konverter antall dager til sekunder ved å bruke time.time()-metoden.
  • Sjekk om stien eksisterer ved hjelp av os.path.exists(path).
  • Hvis stien eksisterer, får du en liste over filer og mapper, inkludert undermapper. os.walk(path) returnerer en generator med mapper, filer og undermapper.
  • Lag en full sti til filen eller mappen ved å kombinere gjeldende sti og fil-/mappenavn med os.path.join().
  • Hent ctime fra os.stat(path) ved å bruke attributtet st_ctime.
  • Sammenlign ctime med den beregnede tiden.
  • Hvis resultatet er større enn de ønskede dager, sjekk om det er en fil eller mappe. Bruk os.remove(path) for filer og shutil.rmtree() for mapper.
  • Hvis stien ikke eksisterer, print en feilmelding.

La oss se koden i detalj:

  
# importere nødvendige moduler
import os
import shutil
import time

# hovedfunksjon
def main():

    # initialiserer tellere
    slettede_mapper_teller = 0
    slettede_filer_teller = 0

    # spesifiserer stien
    sti = "/STI_TIL_SLETTE"

    # spesifiserer antall dager
    dager = 30

    # konverterer dager til sekunder
    sekunder = time.time() - (dager * 24 * 60 * 60)

    # sjekker om stien eksisterer
    if os.path.exists(sti):

        # itererer over alle mapper og filer i stien
        for rot_mappe, mapper, filer in os.walk(sti):

            # sammenligner alderen
            if sekunder >= hent_fil_eller_mappe_alder(rot_mappe):
                # fjerner mappen
                fjern_mappe(rot_mappe)
                slettede_mapper_teller += 1
                break

            else:

                # sjekker mapper fra rotmappen
                for mappe in mapper:
                    mappe_sti = os.path.join(rot_mappe, mappe)
                    if sekunder >= hent_fil_eller_mappe_alder(mappe_sti):
                        fjern_mappe(mappe_sti)
                        slettede_mapper_teller += 1


                # sjekker filer i gjeldende mappe
                for fil in filer:
                    fil_sti = os.path.join(rot_mappe, fil)
                    if sekunder >= hent_fil_eller_mappe_alder(fil_sti):
                        fjern_fil(fil_sti)
                        slettede_filer_teller += 1

        else:

            # hvis stien ikke er en mappe
            if sekunder >= hent_fil_eller_mappe_alder(sti):
                fjern_fil(sti)
                slettede_filer_teller += 1


    else:
         print(f'"{sti}" ble ikke funnet')
         slettede_filer_teller += 1

    print(f"Antall slettede mapper: {slettede_mapper_teller}")
    print(f"Antall slettede filer: {slettede_filer_teller}")

def fjern_mappe(sti):
	if not shutil.rmtree(sti):
		print(f"{sti} er fjernet")
	else:
		print(f"Klarte ikke slette {sti}")


def fjern_fil(sti):
	if not os.remove(sti):
		print(f"{sti} er fjernet")
	else:
		print(f"Klarte ikke slette {sti}")


def hent_fil_eller_mappe_alder(sti):
	ctime = os.stat(sti).st_ctime
	return ctime


if __name__ == '__main__':
	main()
    

Du må justere følgende to variabler i koden basert på dine behov:

dager = 30
sti = "/STI_TIL_SLETTE"

Slette filer større enn et gitt antall GB

La oss se hvordan vi finner og sletter filer som er større enn en bestemt størrelse. Dette ligner på det forrige skriptet, men i stedet for alder, bruker vi filstørrelse som parameter.

  
# importerer os modulen
import os

def hent_fil_størrelse(sti):
    størrelse = os.path.getsize(sti)
    return størrelse

def fjern_fil(sti):
    if not os.remove(sti):
        print(f"{sti} er slettet")
    else:
        print(f"Klarte ikke slette {sti}")

def main():
    sti = "SKRIV_INN_STI_HER"
    størrelse = 500

    if os.path.exists(sti):
        størrelse = størrelse * 1024 * 1024
        for rot_mappe, mapper, filer in os.walk(sti):
            for fil in filer:
                fil_sti = os.path.join(rot_mappe, fil)
                if hent_fil_størrelse(fil_sti) >= størrelse:
                    fjern_fil(fil_sti)
        else:
            if os.path.isfile(sti):
                if hent_fil_størrelse(sti) >= størrelse:
                    fjern_fil(sti)
    else:
        print(f"{sti} eksisterer ikke")

if __name__ == '__main__':
    main()
    

Juster disse to variablene:

sti = "SKRIV_INN_STI_HER"
størrelse = 500

Fjerne filer med en bestemt filtype

Noen ganger vil du kanskje slette filer basert på filtype, f.eks. alle .log-filer. Dette kan du gjøre ved å bruke os.path.splitext(path) som returnerer en tuppel med sti og filtype.

  
# importerer os modulen
import os

def main():
    sti = "STI_TIL_FILER"
    filtype = ".log"

    if os.path.exists(sti):
        if os.path.isdir(sti):
            for rot_mappe, mapper, filer in os.walk(sti):
                for fil in filer:
                    fil_sti = os.path.join(rot_mappe, fil)
                    fil_utvidelse = os.path.splitext(fil_sti)[1]
                    if filtype == fil_utvidelse:
                        if not os.remove(fil_sti):
                            print(f"{fil_sti} slettet")
                        else:
                            print(f"Klarte ikke slette {fil_sti}")
        else:
            print(f"{sti} er ikke en mappe")
    else:
         print(f"{sti} eksisterer ikke")

if __name__ == '__main__':
    main()
    

Husk å oppdatere sti og filtype i koden slik at de passer dine behov.

Det er lurt å teste skriptene i et ikke-produksjonsmiljø. Når du er fornøyd med resultatene kan du planlegge dem via cron (hvis du bruker Linux) for å kjøre dem regelmessig for vedlikehold. Python er fantastisk for å automatisere slike oppgaver, og hvis du vil lære mer, sjekk ut dette Udemy-kurset.

Likte du denne artikkelen? Del den gjerne med andre!