Skip to content

Instantly share code, notes, and snippets.

@PavelNiedoba
Last active April 15, 2020 03:07
Show Gist options
  • Save PavelNiedoba/811a193e8a71286f72460510e1d2d9e9 to your computer and use it in GitHub Desktop.
Save PavelNiedoba/811a193e8a71286f72460510e1d2d9e9 to your computer and use it in GitHub Desktop.
Python cleanup script
#!/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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment