Pravidelná manuální údržba souborového systému není efektivní. Je mnohem lepší ji automatizovat!
Ruční promazávání souborů a složek není zrovna zábavná činnost. Proto je automatizace tohoto procesu velmi rozumná.
Zde se otevírá prostor pro Python, který nám může usnadnit život. Python je skvělý programovací jazyk pro vytváření skriptů. S jeho pomocí můžeme tuto úlohu vyřešit snadno a bez komplikací. Nejprve je dobré si ujasnit, proč je Python pro tento účel vhodný.
- Python je velmi oblíbený pro automatizaci různých úloh.
- Potřebuje méně kódu než jiné programovací jazyky.
- Je kompatibilní s různými operačními systémy, takže stejný kód poběží na Windows, Linuxu i macOS.
- Disponuje modulem ‚os‘, který umožňuje interakci s operačním systémem. Tento modul využijeme k automatizaci mazání souborů.
Python nám umožňuje nahradit opakující se a nudné systémové úlohy. Psaní skriptů pro specifické systémové úkoly je s dobrou znalostí Pythonu velmi jednoduché. Podívejme se na konkrétní případy použití.
Poznámka: Následující příklady jsou testovány v prostředí Python 3.6 a novějším.
Odstranění souborů/složek starších než X dní
Často se stává, že staré logy a jiné soubory zabírají místo a je třeba je pravidelně promazávat. Neplatí to jen o log souborech, ale o jakýchkoliv starých datech.
Modul ‚os‘ nabízí metodu ‚stat‘, která poskytuje informace o časech posledního přístupu (st_atime), modifikace (st_mtime) a modifikace metadat (st_ctime). Všechny tyto časy jsou udávány v sekundách od epochy. Více informací o epoše naleznete zde.
Pro procházení složek a podsložek využijeme metodu ‚os.walk(cesta)‘.
Následující kroky představují logický postup, jak napsat kód, který odstraní soubory a složky starší než stanovený počet dní:
- Importujte moduly: time, os, shutil.
- Definujte proměnné pro cestu a počet dní.
- Převeďte počet dní na sekundy pomocí metody time.time().
- Ověřte, zda cesta existuje pomocí metody os.path.exists(path).
- Pokud cesta existuje, získejte seznam souborů a složek včetně podsložek. Použijte metodu os.walk(path), která vrací generátor se složkami, soubory a podsložkami.
- Získejte cestu k souboru nebo složce spojením aktuální cesty a názvu souboru/složky metodou os.path.join().
- Získejte čas ‚ctime‘ z metody os.stat(cesta) pomocí atributu ‚st_ctime‘.
- Porovnejte čas ‚ctime‘ s vypočítaným časem.
- Pokud je výsledek větší než zadaný počet dní, ověřte, zda se jedná o soubor nebo složku. Pokud je to soubor, použijte os.remove(cesta), jinak použijte metodu shutil.rmtree().
- Pokud cesta neexistuje, vypište chybovou zprávu.
Nyní se podívejme na samotný kód.
# Import potřebných modulů
import os
import shutil
import time
# Hlavní funkce
def main():
# Inicializace počítadel
deleted_folders_count = 0
deleted_files_count = 0
# Zadejte cestu
path = "/PATH_PRO_SMAZANI"
# Zadejte počet dní
days = 30
# Převod dní na sekundy
# time.time() vrací aktuální čas v sekundách
seconds = time.time() - (days * 24 * 60 * 60)
# Ověření existence cesty
if os.path.exists(path):
# Iterace přes složky a soubory v cestě
for root_folder, folders, files in os.walk(path):
# Porovnání s časem
if seconds >= get_file_or_folder_age(root_folder):
# Odstranění složky
remove_folder(root_folder)
deleted_folders_count += 1 # Zvýšení počítadla
# Ukončení po odstranění kořenové složky
break
else:
# Procházení složek v kořenové složce
for folder in folders:
# Cesta k složce
folder_path = os.path.join(root_folder, folder)
# Porovnání s časem
if seconds >= get_file_or_folder_age(folder_path):
# Volání funkce pro odstranění složky
remove_folder(folder_path)
deleted_folders_count += 1 # Zvýšení počítadla
# Procházení souborů v aktuálním adresáři
for file in files:
# Cesta k souboru
file_path = os.path.join(root_folder, file)
# Porovnání s časem
if seconds >= get_file_or_folder_age(file_path):
# Volání funkce pro odstranění souboru
remove_file(file_path)
deleted_files_count += 1 # Zvýšení počítadla
else:
# Pokud cesta není adresář
# Porovnání s časem
if seconds >= get_file_or_folder_age(path):
# Volání funkce pro odstranění souboru
remove_file(path)
deleted_files_count += 1 # Zvýšení počítadla
else:
# Soubor nebo složka nenalezena
print(f'"{path}" nebyla nalezena')
deleted_files_count += 1 # Zvýšení počítadla
print(f"Celkem odstraněno složek: {deleted_folders_count}")
print(f"Celkem odstraněno souborů: {deleted_files_count}")
def remove_folder(path):
# Odstranění složky
if not shutil.rmtree(path):
# Hláška o úspěchu
print(f"{path} byla úspěšně odstraněna")
else:
# Hláška o neúspěchu
print(f"Nepodařilo se odstranit {path}")
def remove_file(path):
# Odstranění souboru
if not os.remove(path):
# Hláška o úspěchu
print(f"{path} byl úspěšně odstraněn")
else:
# Hláška o neúspěchu
print(f"Nepodařilo se odstranit {path}")
def get_file_or_folder_age(path):
# Získání času ctime souboru/složky
# Čas je v sekundách
ctime = os.stat(path).st_ctime
# Vrácení času
return ctime
if __name__ == '__main__':
main()
Je potřeba upravit následující dvě proměnné v kódu, aby odpovídaly vašim požadavkům:
days = 30
path = "/PATH_PRO_SMAZANI"
Odstranění souborů větších než X GB
Tento skript vyhledá a odstraní soubory, které přesahují určitou velikost. Je podobný předchozímu skriptu. Místo stáří souboru zde zadáváme maximální velikost souboru.
# Import modulu os
import os
# Funkce vracející velikost souboru
def get_file_size(path):
# Získání velikosti souboru v bytech
size = os.path.getsize(path)
# Vrácení velikosti souboru
return size
# Funkce pro odstranění souboru
def remove_file(path):
# Odstranění souboru
if not os.remove(path):
# Úspěch
print(f"{path} byl úspěšně odstraněn")
else:
# Chyba
print(f"Nepodařilo se odstranit {path}")
def main():
# Zadejte cestu
path = "SEM_ZADEJTE_CESTU"
# Zadejte maximální velikost souboru v MB
size = 500
# Ověření existence cesty
if os.path.exists(path):
# Převod velikosti na bajty
size = size * 1024 * 1024
# Procházení podsložek
for root_folder, folders, files in os.walk(path):
# Iterace přes seznam souborů
for file in files:
# Získání cesty k souboru
file_path = os.path.join(root_folder, file)
# Ověření velikosti souboru
if get_file_size(file_path) >= size:
# Volání funkce pro odstranění souboru
remove_file(file_path)
else:
# Ověření, zda je cesta soubor
if os.path.isfile(path):
# Cesta není adresář
# Přímá kontrola souboru
if get_file_size(path) >= size:
# Volání funkce pro odstranění souboru
remove_file(path)
else:
# Cesta neexistuje
print(f"{path} neexistuje")
if __name__ == '__main__':
main()
Upravte následující proměnné:
path = "SEM_ZADEJTE_CESTU"
size = 500
Odstranění souborů s konkrétní příponou
Někdy může být potřeba odstranit soubory specifického typu, například soubory ‚.log‘. Příponu souboru lze zjistit pomocí metody os.path.splitext(path), která vrací dvojici obsahující cestu a příponu souboru.
# Import modulu os
import os
# Hlavní funkce
def main():
# Zadejte cestu
path = "CESTA_PRO_HLEDANI"
# Zadejte příponu
extension = ".log"
# Ověření existence cesty
if os.path.exists(path):
# Ověření, zda je cesta adresář
if os.path.isdir(path):
# Iterace přes podsložky
for root_folder, folders, files in os.walk(path):
# Procházení souborů
for file in files:
# Cesta k souboru
file_path = os.path.join(root_folder, file)
# Získání přípony z názvu souboru
file_extension = os.path.splitext(file_path)[1]
# Kontrola přípony
if extension == file_extension:
# Odstranění souboru
if not os.remove(file_path):
# Hláška o úspěchu
print(f"{file_path} byl úspěšně odstraněn")
else:
# Hláška o neúspěchu
print(f"Nepodařilo se odstranit {file_path}")
else:
# Cesta není adresář
print(f"{path} není adresář")
else:
# Cesta neexistuje
print(f"{path} neexistuje")
if __name__ == '__main__':
# Volání hlavní funkce
main()
Nezapomeňte aktualizovat cestu a proměnnou rozšíření v kódu dle potřeby.
Doporučuje se otestovat skripty nejprve v neprodukčním prostředí. Pokud budete s výsledky spokojeni, můžete nastavit pravidelné spouštění skriptů pomocí cronu (v Linuxu) pro automatickou údržbu. Python je skvělý nástroj pro takové úkoly. Pokud máte zájem naučit se více, podívejte se na tento Kurz Udemy.
Líbil se Vám článek? Sdílejte ho s ostatními!