Scripturi Python pentru a șterge fișierele în mod regulat

Curățarea regulată manuală a sistemului de fișiere nu este bună. Automatizează-le!

Ștergerea manuală a fișierelor și folderelor nu este o sarcină interesantă, așa cum se poate crede. Are sens să le automatizezi.

Aici vine Python pentru a ne ușura viața. Python este un limbaj de programare excelent pentru scripting. Vom profita de Python pentru a ne termina sarcina fără niciun obstacol. În primul rând, ar trebui să știți de ce Python este o alegere bună.

  • Python este un limbaj preferat din toate timpurile pentru automatizarea sarcinilor
  • Mai puțin cod în comparație cu alte limbaje de programare
  • Python este compatibil cu toate sistemele de operare. Puteți rula același cod în Windows, Linux și Mac.
  • Python are un modul numit os care ne ajută să interacționăm cu sistemul de operare. Vom folosi acest modul pentru a finaliza automatizarea ștergerii fișierelor.

Putem înlocui orice sarcini de sistem enervante sau repetitive folosind Python. Scrierea de scripturi pentru a finaliza o anumită sarcină de sistem este un cupcake dacă cunoașteți Python. Să ne uităm la următorul caz de utilizare.

Notă: următoarele sunt testate pe Python 3.6+

Se elimină fișierele/folderele mai vechi de X zile

Adesea nu aveți nevoie de bușteni vechi și trebuie să le curățați în mod regulat pentru a face spațiu de stocare disponibil. Ar putea fi orice și nu doar bușteni.

Avem o metodă numită stat în modulul os, care oferă detalii despre ultimul acces (st_atime), modificarea (st_mtime) și timpul de modificare a metadatelor (st_ctime). Toate metodele returnează timpul în secunde de la epocă. Mai multe detalii despre epocă găsiți aici.

  Tweet Balloon vă permite să vizualizați cronologia ca o suprapunere pe ecranul dvs. de pornire

Vom folosi o metodă numită os.walk(path) pentru a parcurge subfolderele unui folder.

Urmați pașii de mai jos pentru a scrie codul pentru fișierele/folderele de ștergere în funcție de numărul de zile.

  • Importă modulele time, os, shutil
  • Setați calea și zilele la variabile
  • Convertiți numărul de zile în secunde folosind metoda time.time().
  • Verificați dacă calea există sau nu folosind modulul os.path.exists(path).
  • Dacă calea există, atunci obțineți lista fișierelor și folderelor prezente în cale, inclusiv subfolderele. Utilizați metoda os.walk(cale) și va returna un generator care conține foldere, fișiere și subdosare
  • Obțineți calea fișierului sau a folderului unind atât calea curentă, cât și numele fișierului/dosarului folosind metoda os.path.join()
  • Obțineți ctime din metoda os.stat(path) folosind atributul st_ctime
  • Comparați ctime cu timpul pe care l-am calculat anterior
  • Dacă rezultatul este mai mare decât zilele dorite de utilizator, atunci verificați dacă este un fișier sau un folder. Dacă este un fișier, utilizați os.remove(cale) altfel utilizați metoda shutil.rmtree()
  • Dacă calea nu există, imprimați mesajul negăsit

Să vedem codul în detaliu.

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

Trebuie să ajustați următoarele două variabile din codul de mai sus în funcție de cerință.

days = 30 
path = "/PATH_TO_DELETE"

Se elimină fișiere mai mari de X GB

Să căutăm fișierele care sunt mai mari decât o anumită dimensiune și să le ștergem. Este similar cu scriptul de mai sus. În scriptul anterior, am luat vârsta ca parametru, iar acum vom lua dimensiunea ca parametru pentru ștergere.

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

Ajustați următoarele două variabile.

path = "ENTER_PATH_HERE" 
size = 500

Eliminarea fișierelor cu o anumită extensie

S-ar putea să existe un scenariu în care doriți să ștergeți fișierele după tipurile lor de extensii. Să spunem fișierul .log. Putem găsi extensia unui fișier folosind metoda os.path.splitext(path). Returnează un tuplu care conține calea și extensia fișierului.

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

Nu uitați să actualizați calea și variabila extensie din codul de mai sus pentru a vă îndeplini cerințele.

  13 lumini LED/neon pentru a vă îmbunătăți configurația de joc

Aș sugera testarea scripturilor în mediul NON PRODUCTION. Odată ce sunteți mulțumit de rezultate, puteți programa prin cron (dacă utilizați Linux) să îl rulați periodic pentru lucrări de întreținere. Python este grozav pentru a realiza aceste lucruri și, dacă sunteți interesat să învățați să faceți mai multe, verificați acest lucru Curs Udemy.

Ți-a plăcut să citești articolul? Ce zici de împărtășirea cu lumea?