Ο τακτικός μη αυτόματος καθαρισμός του συστήματος αρχείων δεν είναι καλός. Αυτοματοποιήστε τα!
Η μη αυτόματη διαγραφή αρχείων και φακέλων δεν είναι μια συναρπαστική εργασία, όπως μπορεί να σκεφτεί κανείς. Είναι λογικό να τα αυτοματοποιούμε.
Εδώ έρχεται η 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). Όλες οι μέθοδοι επιστρέφουν τον χρόνο σε δευτερόλεπτα από την εποχή. Μπορείτε να βρείτε περισσότερες λεπτομέρειες για την εποχή εδώ.
Θα χρησιμοποιήσουμε μια μέθοδο που ονομάζεται 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()
Μην ξεχάσετε να ενημερώσετε τη μεταβλητή διαδρομής και επέκτασης στον παραπάνω κώδικα για να καλύψετε τις απαιτήσεις σας.
Θα πρότεινα να δοκιμάσετε τα σενάρια στο περιβάλλον NON PRODUCTION. Μόλις είστε ικανοποιημένοι με τα αποτελέσματα, μπορείτε να προγραμματίσετε μέσω του cron (αν χρησιμοποιείτε Linux) να το εκτελείτε περιοδικά για εργασίες συντήρησης. Η Python είναι εξαιρετική για να πετύχει αυτό το πράγμα και αν ενδιαφέρεστε να μάθετε να κάνετε περισσότερα, ελέγξτε αυτό Μάθημα Udemy.
Σας άρεσε να διαβάζετε το άρθρο; Τι θα λέγατε να μοιράζεστε με τον κόσμο;