Regularne, ręczne porządkowanie plików to mało efektywny sposób na zarządzanie systemem. Warto je zautomatyzować!
Ręczne usuwanie niepotrzebnych plików i katalogów jest czynnością, która szybko staje się nużąca. Automatyzacja tego procesu wydaje się idealnym rozwiązaniem.
Z pomocą przychodzi Python, język, który ułatwia wiele aspektów pracy z komputerem. Jest to znakomite narzędzie do tworzenia skryptów. Wykorzystując jego potencjał, wykonamy nasze zadanie sprawnie i bez zbędnych problemów. Zanim jednak przejdziemy do sedna, warto omówić, dlaczego Python jest tak dobrym wyborem do tego typu operacji.
- Python to popularny język programowania, często wybierany do automatyzacji różnych zadań.
- W porównaniu do innych języków, Python charakteryzuje się zwięzłym kodem.
- Python jest kompatybilny z różnymi platformami. Ten sam kod można uruchomić bez problemu na systemach Windows, Linux oraz macOS.
- Python oferuje moduł os, który umożliwia interakcję z systemem operacyjnym. Wykorzystamy ten moduł, aby efektywnie zautomatyzować proces usuwania plików.
Dzięki Pythonowi, możemy zautomatyzować wiele uciążliwych i powtarzalnych czynności. Tworzenie skryptów do wykonywania konkretnych zadań systemowych jest proste, o ile zna się podstawy Pythona. Przyjrzyjmy się konkretnym przykładom.
Uwaga: Poniższe skrypty były testowane w środowisku Python 3.6 i nowszych.
Usuwanie plików i katalogów starszych niż X dni
Często zdarza się, że stare logi i pliki stają się niepotrzebne i zajmują cenne miejsce na dysku. Konieczne jest regularne ich czyszczenie. Ten mechanizm można wykorzystać nie tylko do logów, ale również do innych typów danych.
Moduł `os` zawiera funkcję `stat`, która dostarcza informacje o czasie ostatniego dostępu (st_atime), modyfikacji (st_mtime) oraz zmianie metadanych (st_ctime). Wszystkie te czasy są prezentowane w sekundach od tzw. epoki. Szczegółowe informacje na temat epoki znajdziesz w dokumentacji.
Do przeszukiwania podkatalogów wykorzystamy funkcję `os.walk(path)`.
Oto kroki potrzebne do stworzenia skryptu, który usuwa pliki i katalogi na podstawie ich wieku:
- Zaimportuj niezbędne moduły: `time`, `os` i `shutil`.
- Zdefiniuj zmienne, które przechowają ścieżkę oraz liczbę dni.
- Przelicz liczbę dni na sekundy, używając `time.time()`.
- Sprawdź, czy podana ścieżka istnieje za pomocą funkcji `os.path.exists(path)`.
- Jeśli ścieżka istnieje, pobierz listę wszystkich plików i katalogów (wraz z podkatalogami) za pomocą `os.walk(path)`. Funkcja ta zwróci generator, który dostarczy potrzebne informacje.
- Uzyskaj pełną ścieżkę do każdego pliku i katalogu, łącząc ścieżkę bieżącego katalogu z nazwą elementu, przy użyciu `os.path.join()`.
- Pobierz czas utworzenia elementu (ctime) za pomocą `os.stat(path).st_ctime`.
- Porównaj czas utworzenia elementu z czasem wyznaczonym na podstawie liczby dni.
- Jeśli czas utworzenia jest starszy niż założona granica, sprawdź, czy mamy do czynienia z plikiem, czy katalogiem. Jeśli jest to plik, użyj `os.remove(path)`, jeśli katalog – `shutil.rmtree()`.
- Jeśli ścieżka nie istnieje, wypisz komunikat o błędzie.
Oto szczegółowy kod realizujący opisane zadanie.
import os import shutil import time def main(): deleted_folders_count = 0 deleted_files_count = 0 path = "/PATH_TO_DELETE" 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}" is not found') deleted_files_count += 1 print(f"Total folders deleted: {deleted_folders_count}") print(f"Total files deleted: {deleted_files_count}") def remove_folder(path): if not shutil.rmtree(path): print(f"{path} is removed successfully") else: print(f"Unable to delete the {path}") def remove_file(path): if not os.remove(path): print(f"{path} is removed successfully") else: print(f"Unable to delete the {path}") def get_file_or_folder_age(path): ctime = os.stat(path).st_ctime return ctime if __name__ == '__main__': main()
W powyższym kodzie musisz dostosować dwie zmienne do własnych wymagań:
days = 30 path = "/PATH_TO_DELETE"
Usuwanie plików większych niż X GB
Ten skrypt posłuży do wyszukiwania i usuwania plików przekraczających określony rozmiar. Jest on podobny do poprzedniego, ale zamiast wieku pliku, będziemy porównywać jego rozmiar.
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} is deleted successfully") else: print(f"Unable to delete the {path}") def main(): path = "ENTER_PATH_HERE" 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} doesn't exist") if __name__ == '__main__': main()
Dostosuj poniższe dwie zmienne do swoich potrzeb:
path = "ENTER_PATH_HERE" size = 500
Usuwanie plików z określonym rozszerzeniem
Czasami konieczne jest usuwanie plików o konkretnym rozszerzeniu, np. .log. W Pythonie do wyodrębnienia rozszerzenia można użyć funkcji `os.path.splitext(path)`. Zwraca ona krotkę zawierającą ścieżkę oraz rozszerzenie.
import os def main(): path = "PATH_TO_LOOK_FOR" 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} deleted successfully") else: print(f"Unable to delete the {file_path}") else: print(f"{path} is not a directory") else: print(f"{path} doesn't exist") if __name__ == '__main__': main()
Pamiętaj, aby dostosować zmienne `path` oraz `extension` w powyższym kodzie, by pasowały do Twoich potrzeb.
Zalecam przetestowanie wszystkich skryptów w środowisku testowym, zanim użyjesz ich w środowisku produkcyjnym. Po upewnieniu się, że działają poprawnie, możesz zaplanować ich regularne uruchamianie za pomocą crona (w systemach Linux) w celu przeprowadzania automatycznej konserwacji systemu. Python jest doskonałym narzędziem do takich celów. Jeśli chcesz poszerzyć swoją wiedzę na jego temat, warto rozważyć ten kurs Udemy.
Podobał Ci się ten artykuł? Jeśli tak, podziel się nim ze znajomymi!
newsblog.pl
Maciej – redaktor, pasjonat technologii i samozwańczy pogromca błędów w systemie Windows. Zna Linuxa lepiej niż własną lodówkę, a kawa to jego główne źródło zasilania. Pisze, testuje, naprawia – i czasem nawet wyłącza i włącza ponownie. W wolnych chwilach udaje, że odpoczywa, ale i tak kończy z laptopem na kolanach.