Python skripty pro pravidelné mazání souborů

Pravidelné ruční čištění souborového systému není dobré. Automatizujte je!

Ruční mazání souborů a složek není vzrušující úkol, jak si někdo může myslet. Má smysl je automatizovat.

Zde přichází Python, aby nám usnadnil život. Python je vynikající programovací jazyk pro skriptování. Využijeme Python k dokončení našeho úkolu bez jakékoli překážky. Nejprve byste měli vědět, proč je Python dobrou volbou.

  • Python je oblíbený jazyk všech dob pro automatizaci úloh
  • Méně kódu ve srovnání s jinými programovacími jazyky
  • Python je kompatibilní se všemi operačními systémy. Stejný kód můžete spustit ve Windows, Linuxu a Macu.
  • Python má modul nazvaný os, který nám pomáhá při interakci s operačním systémem. Tento modul použijeme k dokončení naší automatizace mazání souborů.

Jakékoli otravné nebo opakující se systémové úlohy můžeme nahradit pomocí Pythonu. Psaní skriptů pro dokončení konkrétní systémové úlohy je hračka, pokud znáte Python. Podívejme se na následující případ použití.

Poznámka: Následující jsou testovány na Pythonu 3.6+

Odebírání souborů/složek starších než X dní

Často nepotřebujete staré protokoly a musíte je pravidelně čistit, abyste měli k dispozici úložiště. Může to být cokoli, nejen protokoly.

V modulu os máme metodu nazvanou stat, která poskytuje podrobnosti o čase posledního přístupu (st_atime), modifikace (st_mtime) a modifikace metadat (st_ctime). Všechny metody vracejí čas v sekundách od epochy. Více podrobností o epoše naleznete zde.

Pro procházení podsložkami složky použijeme metodu nazvanou os.walk(cesta).

Podle níže uvedených kroků zapište kód pro smazané soubory/složky na základě počtu dní.

  • Importujte moduly time, os, shutil
  • Nastavte cestu a dny proměnným
  • Převeďte počet dní na sekundy pomocí metody time.time().
  • Zkontrolujte, zda cesta existuje nebo ne, pomocí modulu os.path.exists(path).
  • Pokud cesta existuje, získejte seznam souborů a složek přítomných v cestě, včetně podsložek. Použijte metodu os.walk(path) a vrátí generátor obsahující složky, soubory a podsložky
  • Získejte cestu k souboru nebo složce spojením aktuální cesty a názvu souboru/složky pomocí metody os.path.join()
  • Získejte ctime z metody os.stat(cesta) pomocí atributu st_ctime
  • Porovnejte čas ctime s časem, který jsme vypočítali dříve
  • Pokud je výsledek větší než požadované dny uživatele, zkontrolujte, zda se jedná o soubor nebo složku. Pokud se jedná o soubor, použijte os.remove(cesta), jinak použijte metodu shutil.rmtree()
  • Pokud cesta neexistuje, vytiskněte zprávu nenalezena
  Najděte si náhodný film nebo televizní pořad, který chcete sledovat

Podívejme se na kód podrobně.

# 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()

Musíte upravit následující dvě proměnné ve výše uvedeném kódu na základě požadavku.

days = 30 
path = "/PATH_TO_DELETE"

Odebírání souborů větších než X GB

Vyhledejme soubory, které jsou větší než určitá velikost, a smažte je. Je podobný výše uvedenému skriptu. V předchozím skriptu jsme jako parametr vzali věk a nyní jako parametr pro smazání vezmeme velikost.

# 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()

Upravte následující dvě proměnné.

path = "ENTER_PATH_HERE" 
size = 500

Odstranění souborů s konkrétní příponou

Může nastat situace, kdy budete chtít odstranit soubory podle typů přípon. Řekněme soubor .log. Příponu souboru můžeme najít pomocí metody os.path.splitext(path). Vrací n-tici obsahující cestu a příponu souboru.

# 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()

Nezapomeňte aktualizovat cestu a proměnnou rozšíření ve výše uvedeném kódu, aby vyhovovaly vašim požadavkům.

  Jak najít negativní SEO?

Navrhoval bych otestovat skripty v prostředí NON PRODUCTION. Jakmile budete s výsledky spokojeni, můžete pomocí cronu (pokud používáte Linux) naplánovat jeho pravidelné spouštění pro údržbu. Python je skvělý k dosažení těchto věcí a pokud máte zájem naučit se dělat více, podívejte se na toto Kurz Udemy.

Užili jste si čtení článku? Co takhle sdílet se světem?