Σενάρια Python για τη διαγραφή των αρχείων τακτικά

Ο τακτικός μη αυτόματος καθαρισμός του συστήματος αρχείων δεν είναι καλός. Αυτοματοποιήστε τα!

Η μη αυτόματη διαγραφή αρχείων και φακέλων δεν είναι μια συναρπαστική εργασία, όπως μπορεί να σκεφτεί κανείς. Είναι λογικό να τα αυτοματοποιούμε.

Εδώ έρχεται η Python για να κάνει τη ζωή μας πιο εύκολη. Η Python είναι μια εξαιρετική γλώσσα προγραμματισμού για scripting. Θα εκμεταλλευτούμε την Python για να ολοκληρώσουμε την εργασία μας χωρίς κανένα εμπόδιο. Πρώτα, πρέπει να ξέρετε γιατί η Python είναι μια καλή επιλογή.

  • Η Python είναι μια αγαπημένη γλώσσα όλων των εποχών για την αυτοματοποίηση εργασιών
  • Λιγότερος κώδικας σε σύγκριση με άλλες γλώσσες προγραμματισμού
  • Η Python είναι συμβατή με όλα τα λειτουργικά συστήματα. Μπορείτε να εκτελέσετε τον ίδιο κώδικα σε Windows, Linux και Mac.
  • Η Python έχει μια λειτουργική μονάδα που ονομάζεται os που μας βοηθά να αλληλεπιδρούμε με το λειτουργικό σύστημα. Θα χρησιμοποιήσουμε αυτήν την ενότητα για να ολοκληρώσουμε την αυτοματοποίηση της διαγραφής των αρχείων.

Μπορούμε να αντικαταστήσουμε τυχόν ενοχλητικές ή επαναλαμβανόμενες εργασίες συστήματος χρησιμοποιώντας Python. Η σύνταξη σεναρίων για την ολοκλήρωση μιας συγκεκριμένης εργασίας συστήματος είναι ένα cupcake αν γνωρίζετε Python. Ας δούμε την παρακάτω περίπτωση χρήσης.

Σημείωση: τα ακόλουθα δοκιμάζονται σε Python 3.6+

Αφαίρεση αρχείων/φακέλων παλαιότερων των Χ ημερών

Συχνά δεν χρειάζεστε παλιά κούτσουρα και πρέπει να τα καθαρίζετε τακτικά για να έχετε διαθέσιμο χώρο αποθήκευσης. Θα μπορούσε να είναι οτιδήποτε και όχι μόνο κούτσουρα.

Έχουμε μια μέθοδο που ονομάζεται stat στη λειτουργική μονάδα που δίνει λεπτομέρειες για τον χρόνο τελευταίας πρόσβασης (st_atime), τροποποίησης (st_mtime) και τροποποίησης μεταδεδομένων (st_ctime). Όλες οι μέθοδοι επιστρέφουν τον χρόνο σε δευτερόλεπτα από την εποχή. Μπορείτε να βρείτε περισσότερες λεπτομέρειες για την εποχή εδώ.

  Πώς να αλλάξετε τα εικονίδια εφαρμογών, αρχείων και φακέλων σε Mac

Θα χρησιμοποιήσουμε μια μέθοδο που ονομάζεται os.walk(path) για τη διέλευση στους υποφακέλους ενός φακέλου.

Ακολουθήστε τα παρακάτω βήματα για να γράψετε κώδικα για τα αρχεία/φακέλους διαγραφής με βάση τον αριθμό των ημερών.

  • Εισαγάγετε τις ενότητες time, os, shutil
  • Ορίστε τη διαδρομή και τις ημέρες στις μεταβλητές
  • Μετατρέψτε τον αριθμό των ημερών σε δευτερόλεπτα χρησιμοποιώντας τη μέθοδο time.time().
  • Ελέγξτε εάν η διαδρομή υπάρχει ή όχι χρησιμοποιώντας τη λειτουργική μονάδα os.path.exists(path).
  • Εάν η διαδρομή υπάρχει, τότε λάβετε τη λίστα των αρχείων και των φακέλων που υπάρχουν στη διαδρομή, συμπεριλαμβανομένων των υποφακέλων. Χρησιμοποιήστε τη μέθοδο os.walk(path) και θα επιστρέψει μια γεννήτρια που περιέχει φακέλους, αρχεία και υποφακέλους
  • Λάβετε τη διαδρομή του αρχείου ή του φακέλου συνδέοντας τόσο την τρέχουσα διαδρομή όσο και το όνομα αρχείου/φακέλου χρησιμοποιώντας τη μέθοδο os.path.join()
  • Λάβετε το ctime από τη μέθοδο os.stat(path) χρησιμοποιώντας το χαρακτηριστικό st_ctime
  • Συγκρίνετε τον ctime με τον χρόνο που έχουμε υπολογίσει προηγουμένως
  • Εάν το αποτέλεσμα είναι μεγαλύτερο από τις επιθυμητές ημέρες του χρήστη, τότε ελέγξτε αν πρόκειται για αρχείο ή φάκελο. Εάν είναι αρχείο, χρησιμοποιήστε τη μέθοδο os.remove(path) διαφορετικά χρησιμοποιήστε τη μέθοδο shutil.rmtree()
  • Εάν η διαδρομή δεν υπάρχει, εκτυπώστε το μήνυμα δεν βρέθηκε

Ας δούμε αναλυτικά τον κώδικα.

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

Πρέπει να προσαρμόσετε τις ακόλουθες δύο μεταβλητές στον παραπάνω κώδικα με βάση την απαίτηση.

days = 30 
path = "/PATH_TO_DELETE"

Αφαίρεση αρχείων μεγαλύτερα από X GB

Ας αναζητήσουμε τα αρχεία που είναι μεγαλύτερα από ένα συγκεκριμένο μέγεθος και ας τα διαγράψουμε. Είναι παρόμοιο με το παραπάνω σενάριο. Στο προηγούμενο σενάριο, λάβαμε την ηλικία ως παράμετρο και τώρα θα λάβουμε το μέγεθος ως παράμετρο για τη διαγραφή.

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

Προσαρμόστε τις ακόλουθες δύο μεταβλητές.

path = "ENTER_PATH_HERE" 
size = 500

Αφαίρεση αρχείων με συγκεκριμένη επέκταση

Μπορεί να υπάρχει ένα σενάριο όπου θέλετε να διαγράψετε αρχεία με βάση τους τύπους επέκτασής τους. Ας πούμε αρχείο .log. Μπορούμε να βρούμε την επέκταση ενός αρχείου χρησιμοποιώντας τη μέθοδο os.path.splitext(path). Επιστρέφει μια πλειάδα που περιέχει τη διαδρομή και την επέκταση του αρχείου.

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

Μην ξεχάσετε να ενημερώσετε τη μεταβλητή διαδρομής και επέκτασης στον παραπάνω κώδικα για να καλύψετε τις απαιτήσεις σας.

  11 Σύγχρονοι λογαριασμοί ελέγχου επιχειρήσεων για νεοσύστατες και μικρές επιχειρήσεις στις ΗΠΑ

Θα πρότεινα να δοκιμάσετε τα σενάρια στο περιβάλλον NON PRODUCTION. Μόλις είστε ικανοποιημένοι με τα αποτελέσματα, μπορείτε να προγραμματίσετε μέσω του cron (αν χρησιμοποιείτε Linux) να το εκτελείτε περιοδικά για εργασίες συντήρησης. Η Python είναι εξαιρετική για να πετύχει αυτό το πράγμα και αν ενδιαφέρεστε να μάθετε να κάνετε περισσότερα, ελέγξτε αυτό Μάθημα Udemy.

Σας άρεσε να διαβάζετε το άρθρο; Τι θα λέγατε να μοιράζεστε με τον κόσμο;