Python-skript för att radera filerna regelbundet

Att rengöra filsystemet regelbundet manuellt är inte bra. Automatisera dem!

Att radera filer och mappar manuellt är ingen spännande uppgift, som man kanske tror. Det är vettigt att automatisera dem.

Här kommer Python för att göra våra liv enklare. Python är ett utmärkt programmeringsspråk för skript. Vi kommer att dra nytta av Python för att slutföra vår uppgift utan några hinder. Först bör du veta varför Python är ett bra val.

  • Python är ett favoritspråk genom tiderna för att automatisera uppgifter
  • Mindre kod jämfört med andra programmeringsspråk
  • Python är kompatibel med alla operativsystem. Du kan köra samma kod i Windows, Linux och Mac.
  • Python har en modul som heter os som hjälper oss att interagera med operativsystemet. Vi kommer att använda den här modulen för att slutföra vår automatisering av radering av filerna.

Vi kan ersätta alla irriterande eller repetitiva systemuppgifter med Python. Att skriva skript för att slutföra en specifik systemuppgift är en muffin om du kan Python. Låt oss titta på följande användningsfall.

Obs: följande testas på Python 3.6+

Ta bort filer/mappar äldre än X dagar

Ofta behöver du inte gamla stockar, och du behöver regelbundet rengöra dem för att göra förvaring tillgänglig. Det kan vara vad som helst och inte bara stockar.

Vi har en metod som kallas stat i OS-modulen som ger detaljer om senaste åtkomst (st_atime), modifiering (st_mtime) och metadatamodifiering (st_ctime) tid. Alla metoder returnerar tiden i sekunder sedan epoken. Du kan hitta mer information om epoken här.

Vi kommer att använda en metod som heter os.walk(path) för att gå igenom undermappar till en mapp.

Följ stegen nedan för att skriva kod för raderingsfilerna/mapparna baserat på antalet dagar.

  • Importera modulerna time, os, shutil
  • Ställ in sökvägen och dagar till variablerna
  • Konvertera antalet dagar till sekunder med metoden time.time().
  • Kontrollera om sökvägen finns eller inte med hjälp av modulen os.path.exists(path).
  • Om sökvägen finns, hämta listan över filer och mappar som finns i sökvägen, inklusive undermappar. Använd metoden os.walk(path), så returnerar den en generator som innehåller mappar, filer och undermappar
  • Hämta sökvägen till filen eller mappen genom att sammanfoga både den aktuella sökvägen och fil-/mappnamnet med metoden os.path.join()
  • Hämta ctime från metoden os.stat(path) med attributet st_ctime
  • Jämför ctiden med tiden vi har beräknat tidigare
  • Om resultatet är större än användarens önskade dagar, kontrollera om det är en fil eller mapp. Om det är en fil, använd os.remove(path) annars använd metoden shutil.rmtree()
  • Om sökvägen inte finns, skriv ut meddelandet hittades inte

Låt 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åste justera följande två variabler i ovanstående kod baserat på kravet.

days = 30 
path = "/PATH_TO_DELETE"

Ta bort filer större än X GB

Låt oss söka efter filerna som är större än en viss storlek och ta bort dem. Det liknar skriptet ovan. I det tidigare skriptet har vi tagit ålder som parameter, och nu tar vi storlek som parameter för borttagningen.

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

Justera följande två variabler.

path = "ENTER_PATH_HERE" 
size = 500

Ta bort filer med ett specifikt tillägg

Det kan finnas ett scenario där du vill ta bort filer efter deras tilläggstyper. Låt oss säga .log-fil. Vi kan hitta filtillägget med metoden os.path.splitext(path). Den returnerar en tupel som innehåller sökvägen och filtillägget.

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

Glöm inte att uppdatera sökvägen och tilläggsvariabeln i ovanstående kod för att uppfylla dina krav.

Jag skulle föreslå att du testar skripten i EJ PRODUCTION-miljön. När du är nöjd med resultaten kan du schemalägga cron (om du använder Linux) för att köra det regelbundet för underhållsarbete. Python är bra för att uppnå det här och om du är intresserad av att lära dig mer, kolla in det här Udemy kurs.

Gillade du att läsa artikeln? Vad sägs om att dela med världen?