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!