Rengjøring av filsystemet regelmessig manuelt er ikke bra. Automatiser dem!
Å slette filer og mapper manuelt er ikke en spennende oppgave, som man kanskje tror. Det er fornuftig å automatisere dem.
Her kommer Python for å gjøre livene våre enklere. Python er et utmerket programmeringsspråk for skripting. Vi skal dra nytte av Python for å fullføre oppgaven vår uten noen hindring. Først bør du vite hvorfor Python er et godt valg.
- Python er et favorittspråk til alle tider for automatisering av oppgaver
- Mindre kode sammenlignet med andre programmeringsspråk
- Python er kompatibel med alle operativsystemene. Du kan kjøre den samme koden i Windows, Linux og Mac.
- Python har en modul kalt os som hjelper oss å samhandle med operativsystemet. Vi skal bruke denne modulen til å fullføre automatiseringen av sletting av filene.
Vi kan erstatte alle irriterende eller repeterende systemoppgaver ved å bruke Python. Å skrive skript for å fullføre en spesifikk systemoppgave er en cupcake hvis du kjenner Python. La oss se på følgende brukstilfelle.
Merk: følgende er testet på Python 3.6+
Innholdsfortegnelse
Fjerning av filer/mapper eldre enn X dager
Ofte trenger du ikke gamle stokker, og du må jevnlig rengjøre dem for å gjøre lagring tilgjengelig. Det kan være hva som helst og ikke bare logger.
Vi har en metode kalt stat i os-modulen som gir detaljer om siste tilgang (st_atime), modifikasjon (st_mtime) og metadatamodifikasjonstid (st_ctime). Alle metodene returnerer tid i sekunder siden epoken. Du kan finne flere detaljer om epoken her.
Vi vil bruke en metode kalt os.walk(path) for å gå gjennom undermappene til en mappe.
Følg trinnene nedenfor for å skrive kode for slettefilene/mappene basert på antall dager.
- Importer modulene time, os, shutil
- Angi banen og dagene til variablene
- Konverter antall dager til sekunder ved å bruke time.time()-metoden
- Sjekk om banen eksisterer eller ikke ved å bruke os.path.exists(path)-modulen
- Hvis banen eksisterer, får du listen over filer og mapper som finnes i banen, inkludert undermapper. Bruk metoden os.walk(path), og den vil returnere en generator som inneholder mapper, filer og undermapper
- Få banen til filen eller mappen ved å slå sammen både gjeldende bane og fil-/mappenavn ved å bruke metoden os.path.join()
- Hent ctime fra os.stat(path)-metoden ved å bruke attributtet st_ctime
- Sammenlign ctime med tiden vi har beregnet tidligere
- Hvis resultatet er større enn de ønskede dagene til brukeren, sjekk om det er en fil eller mappe. Hvis det er en fil, bruk os.remove(path) ellers bruk shutil.rmtree()-metoden
- Hvis banen ikke eksisterer, skriv ut meldingen ikke funnet
La oss se koden i detalj.
# importing the required modules import os import shutil import time # main function def main(): # initializing the count deleted_folders_count = 0 deleted_files_count = 0 # specify the path path = "/PATH_TO_DELETE" # specify the days days = 30 # converting days to seconds # time.time() returns current time in seconds seconds = time.time() - (days * 24 * 60 * 60) # checking whether the file is present in path or not if os.path.exists(path): # iterating over each and every folder and file in the path for root_folder, folders, files in os.walk(path): # comparing the days if seconds >= get_file_or_folder_age(root_folder): # removing the folder remove_folder(root_folder) deleted_folders_count += 1 # incrementing count # breaking after removing the root_folder break else: # checking folder from the root_folder for folder in folders: # folder path folder_path = os.path.join(root_folder, folder) # comparing with the days if seconds >= get_file_or_folder_age(folder_path): # invoking the remove_folder function remove_folder(folder_path) deleted_folders_count += 1 # incrementing count # checking the current directory files for file in files: # file path file_path = os.path.join(root_folder, file) # comparing the days if seconds >= get_file_or_folder_age(file_path): # invoking the remove_file function remove_file(file_path) deleted_files_count += 1 # incrementing count else: # if the path is not a directory # comparing with the days if seconds >= get_file_or_folder_age(path): # invoking the file remove_file(path) deleted_files_count += 1 # incrementing count else: # file/folder is not found print(f'"{path}" is not found') deleted_files_count += 1 # incrementing count print(f"Total folders deleted: {deleted_folders_count}") print(f"Total files deleted: {deleted_files_count}") def remove_folder(path): # removing the folder if not shutil.rmtree(path): # success message print(f"{path} is removed successfully") else: # failure message print(f"Unable to delete the {path}") def remove_file(path): # removing the file if not os.remove(path): # success message print(f"{path} is removed successfully") else: # failure message print(f"Unable to delete the {path}") def get_file_or_folder_age(path): # getting ctime of the file/folder # time will be in seconds ctime = os.stat(path).st_ctime # returning the time return ctime if __name__ == '__main__': main()
Du må justere følgende to variabler i koden ovenfor basert på kravet.
days = 30 path = "/PATH_TO_DELETE"
Fjerner filer større enn X GB
La oss søke etter filene som er større enn en bestemt størrelse og slette dem. Det ligner på skriptet ovenfor. I forrige script har vi tatt alder som parameter, og nå skal vi ta størrelse som parameter for slettingen.
# importing the os module import os # function that returns size of a file def get_file_size(path): # getting file size in bytes size = os.path.getsize(path) # returning the size of the file return size # function to delete a file def remove_file(path): # deleting the file if not os.remove(path): # success print(f"{path} is deleted successfully") else: # error print(f"Unable to delete the {path}") def main(): # specify the path path = "ENTER_PATH_HERE" # put max size of file in MBs size = 500 # checking whether the path exists or not if os.path.exists(path): # converting size to bytes size = size * 1024 * 1024 # traversing through the subfolders for root_folder, folders, files in os.walk(path): # iterating over the files list for file in files: # getting file path file_path = os.path.join(root_folder, file) # checking the file size if get_file_size(file_path) >= size: # invoking the remove_file function remove_file(file_path) else: # checking only if the path is file if os.path.isfile(path): # path is not a dir # checking the file directly if get_file_size(path) >= size: # invoking the remove_file function remove_file(path) else: # path doesn't exist print(f"{path} doesn't exist") if __name__ == '__main__': main()
Juster følgende to variabler.
path = "ENTER_PATH_HERE" size = 500
Fjerning av filer med en bestemt utvidelse
Det kan være et scenario der du vil slette filer etter filtypene deres. La oss si .log-fil. Vi kan finne filtypen ved å bruke os.path.splitext(path)-metoden. Den returnerer en tuppel som inneholder banen og filtypen.
# importing os module import os # main function def main(): # specify the path path = "PATH_TO_LOOK_FOR" # specify the extension extension = ".log" # checking whether the path exist or not if os.path.exists(path): # check whether the path is directory or not if os.path.isdir(path): # iterating through the subfolders for root_folder, folders, files in os.walk(path): # checking of the files for file in files: # file path file_path = os.path.join(root_folder, file) # extracting the extension from the filename file_extension = os.path.splitext(file_path)[1] # checking the file_extension if extension == file_extension: # deleting the file if not os.remove(file_path): # success message print(f"{file_path} deleted successfully") else: # failure message print(f"Unable to delete the {file_path}") else: # path is not a directory print(f"{path} is not a directory") else: # path doen't exist print(f"{path} doesn't exist") if __name__ == '__main__': # invoking main function main()
Ikke glem å oppdatere banen og utvidelsesvariabelen i koden ovenfor for å møte kravene dine.
Jeg vil foreslå å teste skriptene i NON PRODUCTION-miljøet. Når du er fornøyd med resultatene, kan du planlegge gjennom cron (hvis du bruker Linux) for å kjøre den med jevne mellomrom for vedlikeholdsarbeid. Python er flott å oppnå dette, og hvis du er interessert i å lære å gjøre mer, sjekk ut dette Udemy kurs.
Likte du å lese artikkelen? Hva med å dele med verden?