Автоматизация повторяющейся задачи с использованием Python – удаление файлов
Чистка файловой системы регулярно вручную не годится. Автоматизируйте это!
Имеет смысл автоматизировать эту задачу.
Есть Python, который может сделать нашу жизнь проще.
- Python – самый популярный язык для автоматизации задач
- Меньше кода по сравнению с другими языками программирования
- Python совместим со всеми операционными системами. Вы можете запустить один и тот же код в Windows, Linux и Mac.
- В Python есть модуль os, который помогает нам взаимодействовать с операционной системой. Мы собираемся использовать этот модуль для завершения нашей автоматизации удаления файлов.
Давайте рассмотрим следующий вариант использования.
Примечание: Пример тестируются на Python 3.6+
Удаление файлов / папок старше X дней
Зачастую нам не нужны старые журналы, и вам необходимо регулярно чистить их, чтобы освободить хранилище.
Это может быть что угодно, а не только логи.
- Как найти и удалить файлы старше X дней в Linux
- 🇺🇳 Как найти и удалить файлы старше определенного периода времени в Linux
В модуле 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 для автоматической очистки старых файлов