Питхон скрипте за редовно брисање датотека

Редовно ручно чишћење система датотека није добро. Аутоматизујте их!

Ручно брисање датотека и фасцикли није узбудљив задатак, као што се може мислити. Има смисла да их аутоматизујете.

Овде долази Питхон да нам олакша живот. Питхон је одличан програмски језик за писање скриптова. Искористићемо предности Питхон-а да завршимо свој задатак без икаквих препрека. Прво, требало би да знате зашто је Питхон добар избор.

  • Питхон је увек омиљени језик за аутоматизацију задатака
  • Мање кода у поређењу са другим програмским језицима
  • Питхон је компатибилан са свим оперативним системима. Исти код можете покренути у Виндовс-у, Линук-у и Мац-у.
  • Питхон има модул који се зове ос који нам помаже у интеракцији са оперативним системом. Користићемо овај модул да завршимо аутоматизацију брисања датотека.

Можемо заменити све досадне или понављајуће системске задатке користећи Питхон. Писање скрипти за довршавање одређеног системског задатка је колач ако познајете Питхон. Погледајмо следећи случај употребе.

Напомена: следеће су тестиране на Питхон-у 3.6+

Уклањање датотека/фолдера старијих од Кс дана

Често вам нису потребни стари трупци и редовно их морате чистити да бисте омогућили складиштење. То може бити било шта, а не само трупци.

Имамо метод који се зове стат у ос модулу који даје детаље о времену последњег приступа (ст_атиме), модификације (ст_мтиме) и модификације метаподатака (ст_цтиме). Све методе враћају време у секундама од епохе. Више детаља о епохи можете пронаћи овде.

Користићемо метод који се зове ос.валк(патх) за кретање кроз потфасцикле фасцикле.

Пратите доле наведене кораке да бисте написали код за датотеке/фасцикле за брисање на основу броја дана.

  • Увезите модуле тиме, ос, схутил
  • Подесите путању и дане за променљиве
  • Претворите број дана у секунде користећи методу тиме.тиме().
  • Проверите да ли путања постоји или не помоћу модула ос.патх.екистс(патх).
  • Ако путања постоји, добијте листу датотека и фасцикли присутних на путањи, укључујући поддиректоријуме. Користите метод ос.валк(патх) и он ће вратити генератор који садржи фасцикле, датотеке и потфасцикле
  • Добијте путању датотеке или фасцикле тако што ћете спојити тренутну путању и име датотеке/директоријума користећи метод ос.патх.јоин()
  • Добијте цтиме из методе ос.стат(патх) користећи атрибут ст_цтиме
  • Упоредите цтиме са временом које смо претходно израчунали
  • Ако је резултат већи од жељених дана корисника, онда проверите да ли је у питању датотека или фасцикла. Ако је то датотека, користите ос.ремове(патх) или користите схутил.рмтрее() метод
  • Ако путања не постоји, одштампајте поруку није пронађено
  Стратегија маркетинга садржаја е-књига: Увод

Погледајмо код детаљно.

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

Морате да прилагодите следеће две променљиве у горњем коду на основу захтева.

days = 30 
path = "/PATH_TO_DELETE"

Уклањање датотека веће од Кс ГБ

Хајде да потражимо датотеке које су веће од одређене величине и избришемо их. Слично је горе наведеном сценарију. У претходној скрипти смо узели старост као параметар, а сада ћемо узети величину као параметар за брисање.

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

Подесите следеће две променљиве.

path = "ENTER_PATH_HERE" 
size = 500

Уклањање датотека са одређеним екстензијом

Можда постоји сценарио у којем желите да избришете датотеке према њиховим типовима екстензија. Рецимо .лог фајл. Екстензију датотеке можемо пронаћи помоћу методе ос.патх.сплитект(патх). Враћа тупле који садржи путању и екстензију датотеке.

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

Не заборавите да ажурирате путању и променљиву проширења у горњем коду како бисте испунили ваше захтеве.

  7 Алатке за самозаштиту апликације током извршавања (РАСП) за модерне апликације

Предлажем да се скрипте тестирају у НЕПРОИЗВОДНОМ окружењу. Када будете задовољни резултатима, можете заказати кроз црон (ако користите Линук) да га повремено покрећете ради одржавања. Питхон је одличан за постизање ових ствари и ако сте заинтересовани да научите да урадите више, погледајте ово Удеми цоурсе.

Да ли сте уживали у читању чланка? Шта кажете на дељење са светом?