Python-skript for å slette filene regelmessig

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+

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.

  Hvordan justere tekst vertikalt eller horisontalt i Microsoft Word

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.

  Adblock vs Adblock Plus – Hvilken fungerer best?

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?