Регулярне очищення файлової системи вручну не добре. Автоматизуйте їх!
Видалення файлів і папок вручну не є захоплюючим завданням, як можна подумати. Є сенс їх автоматизувати.
Ось 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). Усі методи повертають час у секундах від епохи. Детальніше про епоху можна дізнатися тут.
Ми будемо використовувати метод під назвою 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(path), інакше використовуйте метод shutil.rmtree().
- Якщо шлях не існує, надрукуйте повідомлення не знайдено
Давайте розглянемо код докладніше.
# 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 ГБ
Знайдіть файли, які перевищують певний розмір, і видаліть їх. Він схожий на наведений вище сценарій. У попередньому скрипті ми брали вік як параметр, а тепер ми візьмемо розмір як параметр для видалення.
# 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()
Не забудьте оновити шлях і змінну розширення у наведеному вище коді відповідно до ваших вимог.
Я б запропонував тестувати сценарії в середовищі NON PRODUCTION. Коли ви будете задоволені результатами, ви можете запланувати через cron (якщо користуєтеся Linux), щоб періодично запускати його для робіт з обслуговування. Python чудово підходить для досягнення цих речей, і якщо ви хочете навчитися робити більше, подивіться це Курс Udemy.
Вам сподобалось читати статтю? Як щодо того, щоб поділитися зі світом?