Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python3
- """
- Script for periodical cleaning of log or backup folders.
- This script will check for disk space in folderToObserve
- and make sure that there's at least minDiskSpaceGB free space
- oldest files will be removed first regardless of their folder
- empty folders are removed, links are not followed
- the params can be provided in command line like:
- diskFreeKeep.py 10 /myFolder1 /otherFolder /asManyULike
- more folders can be provided, but they must be from same filesystem
- """
- import os, sys, datetime
- foldersToObserve = ['/tmp']
- minDiskSpaceGB = 1 # gigabytes
- minDiskSpace = 1024 * 1024 * 1024;
- # if true we print initial content of folder to observe
- printContent = True
- def files_to_delete(folders):
- files = []
- for rootfolder in folders:
- files.extend(
- os.path.join(dirname, filename)
- for dirname, dirnames, filenames in os.walk(rootfolder)
- for filename in filenames
- )
- files.sort(key=getFileTime, reverse=True)
- return files
- def getFileTime(file):
- return os.lstat(file).st_mtime
- def free_space_up_to(free_bytes_required, rootfolder):
- file_list = files_to_delete(rootfolder)
- if printContent:
- print("files in folder", len(file_list))
- print("\n==============");
- for file in file_list:
- print(datetime.datetime.fromtimestamp(os.lstat(file).st_mtime).isoformat(),
- '{:10.3f}'.format(round(os.lstat(file).st_size / 1024 / 1024, 3)),
- "MB",
- file)
- print("==============\n");
- rf = os.open(rootfolder[0], os.O_RDONLY)
- for fileToRemove in file_list:
- try:
- statv = os.fstatvfs(rf)
- if statv.f_bfree * statv.f_bsize >= free_bytes_required:
- print("free space now:", '{:10.3f}'.format(round(statv.f_bfree * statv.f_bsize / 1024 / 1024, 3)), "MB")
- print("We have enough space now")
- break
- print("free space now:", '{:10.3f}'.format(round(statv.f_bfree * statv.f_bsize / 1024 / 1024, 3)), "MB", "removing file", fileToRemove)
- os.remove(fileToRemove)
- except:
- print("Oops!", sys.exc_info()[0], "occured.")
- def setParams(cliParams):
- global minDiskSpace, minDiskSpaceGB, foldersToObserve, printContent
- if len(cliParams) > 1:
- if cliParams[1]:
- minDiskSpaceGB = float(cliParams[1])
- if len(cliParams) > 2:
- foldersToObserve = cliParams[2:]
- minDiskSpace = float(minDiskSpaceGB) * 1024 * 1024 * 1024
- print("Will free up folder", foldersToObserve, "until there's free", minDiskSpaceGB, "GB")
- def deleteEmptyFolders(folderToDelete, removeRoot=False):
- if not removeRoot:
- print ("will try to delete empty folders from", folderToDelete)
- try:
- files = os.listdir(folderToDelete)
- if len(files):
- for f in files:
- fullpath = os.path.join(folderToDelete, f)
- if os.path.isdir(fullpath):
- deleteEmptyFolders(fullpath, True)
- # if folder empty, delete it
- files = os.listdir(folderToDelete)
- if len(files) == 0 and removeRoot:
- print("Removing empty folder:", folderToDelete)
- os.rmdir(folderToDelete)
- except:
- print("error while deleting empty folders", sys.exc_info())
- if __name__ == "__main__":
- setParams(sys.argv)
- free_space_up_to(minDiskSpace, foldersToObserve)
- for folderToDelete in foldersToObserve:
- deleteEmptyFolders(folderToDelete)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement