🐍 Скрипт Python для регулярного удаления файлов

by itisgood

Автоматизация повторяющейся задачи с использованием Python – удаление файлов

Чистка файловой системы регулярно вручную не годится. Автоматизируйте это!
Удаление файлов и папок вручную не является увлекательной задачей, как можно подумать.

Имеет смысл автоматизировать эту задачу.

Есть Python, который может сделать нашу жизнь проще.

Python является отличным языком программирования для скриптов.
Мы собираемся воспользоваться Python, чтобы завершить нашу задачу без каких-либо препятствий.
Во-первых, вы должны знать, почему Python – хороший выбор.
  • Python – самый популярный язык для автоматизации задач
  • Меньше кода по сравнению с другими языками программирования
  • Python совместим со всеми операционными системами. Вы можете запустить один и тот же код в Windows, Linux и Mac.
  • В Python есть модуль os, который помогает нам взаимодействовать с операционной системой. Мы собираемся использовать этот модуль для завершения нашей автоматизации удаления файлов.
Мы можем заменить любые раздражающие или повторяющиеся системные задачи, используя Python.
Написание скриптов для выполнения конкретной системной задачи – изи, если вы знаете Python.

Давайте рассмотрим следующий вариант использования.

Примечание: Пример тестируются на Python 3.6+

Удаление файлов / папок старше X дней

Зачастую нам не нужны старые журналы, и вам необходимо регулярно чистить их, чтобы освободить хранилище.

Это может быть что угодно, а не только логи.

В модуле os у нас есть метод stat, который дает подробную информацию о времени последнего доступа (st_atime), модификации (st_mtime) и времени модификации метаданных (st_ctime).

Все методы возвращают время в секундах с начала epoch.

Вы можете найти более подробную информацию об epoch здесь.

Мы будем использовать метод с именем os.walk (path) для обхода подпапок папки.

Выполните следующие шаги, чтобы написать код для удаления файлов / папок в зависимости от количества дней.

  • Импортируйте модули time, os, shutil
  • Установите путь и дни для переменных
  • Преобразуйте количество дней в секунды, используя метод time.time ().
  • Проверьте, существует ли путь или нет, используя модуль os.path.exists (path)
  • Если путь существует, то получите список файлов и папок, присутствующих в пути, включая подпапки. Используйте метод os.walk (path), и он вернет генератор, содержащий папки, файлы и подпапки
  • Получить путь к файлу или папке, объединив текущий путь и имя файла / папки, используя метод os.path.join ()
  • Получить ctime из метода os.stat (path), используя атрибут st_ctime
  • Сравните ctime со временем, которое мы рассчитали ранее
  • Если результат больше, чем желаемые дни пользователя, то проверьте, является ли это файлом или папкой. Если это файл, используйте os.remove (путь), иначе используйте метод shutil.rmtree ()
  • Если путь не существует, выведите сообщение not found

Давайте посмотрим код подробно.

# 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"

Удаление файлов размером более X ГБ

Давайте найдем файлы, которые больше определенного размера, и удалим их.

Это похоже на приведенный выше скрипт.

В предыдущем скрипте мы взяли в качестве параметра age, а теперь в качестве параметра для удаления будем использовать size.

# 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

Удаление файлов с определенным расширением

Возможен скрипт, когда вы захотите удалить файлы по их типам расширений.

Допустим, файл .log.

Мы можем найти расширение файла, используя метод os.path.splitext (path).

Возвращает вывод, содержащий путь и расширение файла.

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

Не забудьте обновить переменную path и extension в приведенном выше коде, чтобы они соответствовали вашим требованиям.

Я бы предложил протестировать скрипты в не продуктивной среде.

Как только вы будете удовлетворены результатами, вы можете запланировать задачи через cron (если используете Linux) его периодическое выполнение.

⌚ Как создавать и управлять заданиями Cron в Linux

см. также:

Autotrash — инструмент CLI для автоматической очистки старых файлов

 

You may also like

Leave a Comment