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

Регулярне очищення файлової системи вручну – це не дуже ефективно. Краще автоматизувати цей процес!

Ручне видалення файлів та папок може бути нудним заняттям. Автоматизація цього процесу значно полегшить життя.

Python – чудовий інструмент для автоматизації. Це потужна мова програмування, яка ідеально підходить для створення сценаріїв. Давайте використаємо переваги Python, щоб виконати наше завдання без зайвих зусиль. Перш за все, варто зрозуміти, чому Python – гарний вибір.

  • Python – популярна мова для автоматизації різноманітних завдань.
  • Потрібно значно менше коду в порівнянні з іншими мовами програмування.
  • Python сумісний з різними операційними системами. Один і той самий код можна запустити на Windows, Linux та macOS.
  • Python має модуль під назвою “os”, який надає можливість взаємодії з операційною системою. Ми будемо використовувати цей модуль для автоматичного видалення файлів.

Python дозволяє автоматизувати будь-які монотонні або повторювані системні завдання. Написання скриптів для виконання певних дій стає надзвичайно простим, якщо ви знайомі з Python. Розглянемо деякі приклади.

Примітка: Наведені нижче приклади перевірені на Python 3.6+

Видалення файлів/папок, старших за X днів

Часто старі файли стають непотрібними, і їх потрібно періодично видаляти, щоб звільнити місце на диску. Це стосується не тільки лог-файлів, а й будь-яких інших даних.

Модуль “os” має метод “stat”, який надає детальну інформацію про час останнього доступу (st_atime), модифікації (st_mtime) та зміни метаданих (st_ctime). Ці методи повертають час в секундах, що минув з епохи Unix. Більше про епоху можна дізнатися тут.

Для перебору підпапок в каталозі ми будемо використовувати метод “os.walk(path)”.

Виконайте наступні кроки, щоб написати код для видалення файлів/папок на основі їхнього віку:

  • Імпортуйте модулі “time”, “os” та “shutil”.
  • Задайте шлях до каталогу та кількість днів у змінних.
  • Перетворіть кількість днів у секунди, використовуючи “time.time()”.
  • Перевірте, чи існує шлях, використовуючи “os.path.exists(path)”.
  • Якщо шлях існує, отримайте список файлів і папок у цьому каталозі, включаючи вкладені. Використовуйте “os.walk(path)”, який поверне генератор з папками, файлами та підпапками.
  • Сформуйте повний шлях до файлу або папки, використовуючи “os.path.join()”.
  • Отримайте час створення файлу або папки (ctime) за допомогою “os.stat(path).st_ctime”.
  • Порівняйте час створення з часом, який ми розрахували раніше.
  • Якщо час створення старший за заданий вік, перевірте, чи є це файл, чи папка. Якщо файл, використовуйте “os.remove(path)”, інакше – “shutil.rmtree()”.
  • Якщо шлях не існує, виведіть відповідне повідомлення.

Розглянемо код детальніше:

import os
import shutil
import time

def main():
    deleted_folders_count = 0
    deleted_files_count = 0

    path = "/ШЛЯХ_ДО_ВИДАЛЕННЯ"
    days = 30
    seconds = time.time() - (days * 24 * 60 * 60)

    if os.path.exists(path):
        for root_folder, folders, files in os.walk(path):
            if seconds >= get_file_or_folder_age(root_folder):
                remove_folder(root_folder)
                deleted_folders_count += 1
                break
            else:
                for folder in folders:
                    folder_path = os.path.join(root_folder, folder)
                    if seconds >= get_file_or_folder_age(folder_path):
                        remove_folder(folder_path)
                        deleted_folders_count += 1

                for file in files:
                    file_path = os.path.join(root_folder, file)
                    if seconds >= get_file_or_folder_age(file_path):
                        remove_file(file_path)
                        deleted_files_count += 1
        else:
            if seconds >= get_file_or_folder_age(path):
                remove_file(path)
                deleted_files_count += 1
    else:
        print(f'"{path}" не знайдено')
        deleted_files_count += 1

    print(f"Загальна кількість видалених папок: {deleted_folders_count}")
    print(f"Загальна кількість видалених файлів: {deleted_files_count}")


def remove_folder(path):
    if not shutil.rmtree(path):
        print(f"{path} успішно видалено")
    else:
        print(f"Не вдалося видалити {path}")


def remove_file(path):
    if not os.remove(path):
        print(f"{path} успішно видалено")
    else:
        print(f"Не вдалося видалити {path}")


def get_file_or_folder_age(path):
    ctime = os.stat(path).st_ctime
    return ctime


if __name__ == '__main__':
    main()

Вам необхідно змінити значення наступних двох змінних у коді відповідно до ваших потреб:

days = 30
path = "/ШЛЯХ_ДО_ВИДАЛЕННЯ"

Видалення файлів, розміром понад X ГБ

Цей скрипт знаходить файли, розмір яких перевищує заданий, і видаляє їх. Схема схожа на попередній приклад, але замість віку ми використовуємо розмір файлу як параметр для видалення.

import os

def get_file_size(path):
    size = os.path.getsize(path)
    return size

def remove_file(path):
    if not os.remove(path):
        print(f"{path} успішно видалено")
    else:
        print(f"Не вдалося видалити {path}")

def main():
    path = "ВВЕДІТЬ_ШЛЯХ_ТУТ"
    size = 500
    if os.path.exists(path):
        size = size * 1024 * 1024
        for root_folder, folders, files in os.walk(path):
            for file in files:
                file_path = os.path.join(root_folder, file)
                if get_file_size(file_path) >= size:
                    remove_file(file_path)
        else:
            if os.path.isfile(path):
                if get_file_size(path) >= size:
                    remove_file(path)
    else:
        print(f"{path} не існує")

if __name__ == '__main__':
    main()

Змініть наступні дві змінні:

path = "ВВЕДІТЬ_ШЛЯХ_ТУТ"
size = 500

Видалення файлів з певним розширенням

Іноді необхідно видалити файли певного типу (наприклад, з розширенням “.log”). Для цього можна використовувати “os.path.splitext(path)”, який повертає кортеж зі шляхом до файлу та його розширенням.

import os

def main():
    path = "ШЛЯХ_ДО_ПОШУКУ"
    extension = ".log"
    if os.path.exists(path):
        if os.path.isdir(path):
            for root_folder, folders, files in os.walk(path):
                for file in files:
                    file_path = os.path.join(root_folder, file)
                    file_extension = os.path.splitext(file_path)[1]
                    if extension == file_extension:
                        if not os.remove(file_path):
                            print(f"{file_path} успішно видалено")
                        else:
                            print(f"Не вдалося видалити {file_path}")
        else:
            print(f"{path} не є каталогом")
    else:
        print(f"{path} не існує")

if __name__ == '__main__':
    main()

Не забудьте змінити шлях та розширення у коді відповідно до ваших потреб.

Я рекомендую тестувати ці скрипти у середовищі, яке не є продакшн. Коли ви переконаєтесь, що все працює як слід, ви можете запланувати їх запуск через cron (якщо використовуєте Linux) для регулярного виконання завдань з обслуговування. Python чудово підходить для подібних завдань. Якщо ви бажаєте навчитися робити більше, зверніть увагу на цей курс на Udemy.

Чи була стаття корисною? Поділіться нею зі світом!