Python-scripts til at slette filerne regelmæssigt

Rengøring af filsystemet regelmæssigt manuelt er ikke godt. Automatiser dem!

At slette filer og mapper manuelt er ikke en spændende opgave, som man måske tror. Det giver mening at automatisere dem.

Her kommer Python for at gøre vores liv lettere. Python er et fremragende programmeringssprog til scripting. Vi vil udnytte Python til at afslutte vores opgave uden nogen hindring. Først bør du vide, hvorfor Python er et godt valg.

  • Python er et alle tiders yndlingssprog til automatisering af opgaver
  • Mindre kode sammenlignet med andre programmeringssprog
  • Python er kompatibel med alle operativsystemer. Du kan køre den samme kode i Windows, Linux og Mac.
  • Python har et modul kaldet os, der hjælper os med at interagere med operativsystemet. Vi vil bruge dette modul til at fuldføre vores automatisering af sletning af filerne.

Vi kan erstatte alle irriterende eller gentagne systemopgaver ved hjælp af Python. At skrive scripts til at fuldføre en specifik systemopgave er en cupcake, hvis du kender Python. Lad os se på følgende use case.

Bemærk: følgende er testet på Python 3.6+

Fjernelse af filer/mapper ældre end X dage

Ofte har du ikke brug for gamle træstammer, og du skal jævnligt rense dem for at gøre opbevaring tilgængelig. Det kan være hvad som helst og ikke kun logs.

Vi har en metode kaldet stat i os-modulet, der giver detaljer om sidste adgang (st_atime), modifikation (st_mtime) og metadatamodifikation (st_ctime) tid. Alle metoder returnerer tiden i sekunder siden epoken. Du kan finde flere detaljer om epoken her.

Vi vil bruge en metode kaldet os.walk(sti) til at krydse undermapperne i en mappe.

  Transskriber video til tekst med disse 9 bedste software

Følg nedenstående trin for at skrive kode til slettefilerne/mapperne baseret på antallet af dage.

  • Importer modulerne time, os, shutil
  • Indstil stien og dage til variablerne
  • Konverter antallet af dage til sekunder ved hjælp af time.time() metoden
  • Kontroller, om stien findes eller ej, ved at bruge os.path.exists(path)-modulet
  • Hvis stien findes, skal du hente listen over filer og mapper, der findes i stien, inklusive undermapper. Brug metoden os.walk(path), og den vil returnere en generator, der indeholder mapper, filer og undermapper
  • Få stien til filen eller mappen ved at forbinde både den aktuelle sti og fil-/mappenavn ved hjælp af metoden os.path.join()
  • Hent ctime fra os.stat(path)-metoden ved hjælp af attributten st_ctime
  • Sammenlign ctime med den tid, vi tidligere har beregnet
  • Hvis resultatet er større end de ønskede dage for brugeren, skal du kontrollere, om det er en fil eller mappe. Hvis det er en fil, brug os.remove(path), ellers brug shutil.rmtree() metoden
  • Hvis stien ikke findes, skal du udskrive meddelelsen ikke fundet

Lad os se koden i detaljer.

# 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 skal justere følgende to variabler i ovenstående kode baseret på kravet.

days = 30 
path = "/PATH_TO_DELETE"

Fjerner filer større end X GB

Lad os søge efter de filer, der er større end en bestemt størrelse, og slette dem. Det ligner ovenstående script. I det forrige script har vi taget alder som parameter, og nu tager vi størrelse som parameter for sletningen.

# 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 variable.

path = "ENTER_PATH_HERE" 
size = 500

Fjernelse af filer med en bestemt udvidelse

Der kan være et scenarie, hvor du vil slette filer efter deres udvidelsestyper. Lad os sige .log-fil. Vi kan finde filtypenavnet ved at bruge os.path.splitext(path) metoden. Det returnerer en tuple, der indeholder stien og filtypenavnet.

# 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()

Glem ikke at opdatere stien og udvidelsesvariablen i ovenstående kode for at opfylde dine krav.

  Sådan bruger du en GIF som et Apple Watch-baggrund

Jeg vil foreslå at teste scripts i NON PRODUCTION-miljøet. Når du er tilfreds med resultaterne, kan du planlægge gennem cron (hvis du bruger Linux) til at køre det med jævne mellemrum til vedligeholdelsesarbejde. Python er fantastisk til at opnå dette, og hvis du er interesseret i at lære at gøre mere, så tjek dette Udemy kursus.

Nydt at læse artiklen? Hvad med at dele med verden?