Skrypty Pythona do regularnego usuwania plików

Regularne ręczne czyszczenie systemu plików nie jest dobre. Zautomatyzuj je!

Ręczne usuwanie plików i folderów nie jest ekscytującym zadaniem, jak mogłoby się wydawać. Automatyzacja ich ma sens.

Nadchodzi Python, aby ułatwić nam życie. Python to doskonały język programowania do pisania skryptów. Wykorzystamy Pythona, aby bez przeszkód wykonać nasze zadanie. Po pierwsze, powinieneś wiedzieć, dlaczego Python jest dobrym wyborem.

  • Python to wszech czasów ulubiony język do automatyzacji zadań
  • Mniej kodu w porównaniu do innych języków programowania
  • Python jest kompatybilny ze wszystkimi systemami operacyjnymi. Możesz uruchomić ten sam kod w systemach Windows, Linux i Mac.
  • Python ma moduł os, który pomaga nam w interakcji z systemem operacyjnym. Zamierzamy użyć tego modułu, aby dokończyć naszą automatyzację usuwania plików.

Za pomocą Pythona możemy zastąpić wszelkie irytujące lub powtarzające się zadania systemowe. Pisanie skryptów do wykonania określonego zadania systemowego to babeczka, jeśli znasz Pythona. Spójrzmy na następujący przypadek użycia.

Uwaga: poniższe są testowane na Pythonie 3.6+

Usuwanie plików/folderów starszych niż X dni

Często nie potrzebujesz starych dzienników i musisz je regularnie czyścić, aby udostępnić miejsce do przechowywania. Może to być wszystko, a nie tylko dzienniki.

Mamy metodę o nazwie stat w module os, która podaje szczegóły czasu ostatniego dostępu (st_atime), modyfikacji (st_mtime) i modyfikacji metadanych (st_ctime). Wszystkie metody zwracają czas w sekundach od epoki. Więcej szczegółów na temat epoki znajdziesz tutaj.

Do przechodzenia przez podfoldery folderu użyjemy metody o nazwie os.walk(path).

Wykonaj poniższe czynności, aby napisać kod dla usuniętych plików/folderów na podstawie liczby dni.

  • Zaimportuj czas modułów, system operacyjny, Shutil
  • Ustaw ścieżkę i dni do zmiennych
  • Konwertuj liczbę dni na sekundy za pomocą metody time.time()
  • Sprawdź, czy ścieżka istnieje, czy nie, używając modułu os.path.exists(path)
  • Jeśli ścieżka istnieje, pobierz listę plików i folderów znajdujących się w ścieżce, w tym podfolderów. Użyj metody os.walk(path), a zwróci generator zawierający foldery, pliki i podfoldery
  • Uzyskaj ścieżkę do pliku lub folderu, łącząc bieżącą ścieżkę i nazwę pliku/folderu za pomocą metody os.path.join()
  • Pobierz ctime z metody os.stat(path) za pomocą atrybutu st_ctime
  • Porównaj czas c z czasem, który wcześniej obliczyliśmy
  • Jeśli wynik jest większy niż żądane dni użytkownika, sprawdź, czy jest to plik lub folder. Jeśli jest to plik, użyj os.remove(ścieżka), w przeciwnym razie użyj metody Shutil.rmtree()
  • Jeśli ścieżka nie istnieje, wydrukuj komunikat o nieznalezieniu

Zobaczmy szczegółowo kod.

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

Musisz dostosować następujące dwie zmienne w powyższym kodzie na podstawie wymagań.

days = 30 
path = "/PATH_TO_DELETE"

Usuwanie plików większych niż X GB

Wyszukajmy pliki większe niż określony rozmiar i usuń je. Jest podobny do powyższego skryptu. W poprzednim skrypcie przyjęliśmy wiek jako parametr, a teraz przyjmiemy rozmiar jako parametr do usunięcia.

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

Dostosuj następujące dwie zmienne.

path = "ENTER_PATH_HERE" 
size = 500

Usuwanie plików z określonym rozszerzeniem

Może istnieć scenariusz, w którym chcesz usunąć pliki według ich typów rozszerzeń. Powiedzmy, że plik .log. Rozszerzenie pliku możemy znaleźć za pomocą metody os.path.splitext(path). Zwraca krotkę zawierającą ścieżkę i rozszerzenie pliku.

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

Nie zapomnij zaktualizować ścieżki i zmiennej rozszerzenia w powyższym kodzie, aby spełnić Twoje wymagania.

Sugerowałbym przetestowanie skryptów w środowisku NON PRODUCTION. Gdy będziesz zadowolony z wyników, możesz zaplanować za pomocą crona (jeśli używasz Linuksa), aby uruchamiał go okresowo w celu wykonania prac konserwacyjnych. Python jest świetny do osiągnięcia tych rzeczy i jeśli chcesz nauczyć się robić więcej, sprawdź to Kurs Udemy.

Podobał Ci się artykuł? Co powiesz na dzielenie się ze światem?