Python skripty pro pravidelné mazání souborů

Photo of author

By etechblogcz

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!