From a13941ab11945cea840d763083bce0c553c966c1 Mon Sep 17 00:00:00 2001 From: ville rantanen Date: Sat, 15 Feb 2014 10:45:11 +0200 Subject: [PATCH] Tool to delete/remove log/exec folders --- anduril/anduril-remove-files | 105 +++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100755 anduril/anduril-remove-files diff --git a/anduril/anduril-remove-files b/anduril/anduril-remove-files new file mode 100755 index 0000000..38746e7 --- /dev/null +++ b/anduril/anduril-remove-files @@ -0,0 +1,105 @@ +#!/usr/bin/python +import sys +import os,shutil +import re + +from argparse import ArgumentParser + +LOGFILE="_global" +EXECFILE="_state" + +def setup_options(): + parser=ArgumentParser(description="Remove execution folders recusively") + parser.add_argument("-l",action="store_true",dest="logs",default=False, + help="Search for log folders [%(default)s]") + parser.add_argument("-e",action="store_true",dest="execs",default=False, + help="Search for execution folders [%(default)s]") + parser.add_argument("-f",action="store_true",dest="force",default=False, + help="Force deletion, otherwise just lists the entries. WARNING: THIS OPTION DELETES FILES RECURSIVELY WITHOUT ASKING. [%(default)s]") + parser.add_argument("-L",action="store_true",dest="symlinks",default=False, + help="Follow symbolic links [%(default)s]") + parser.add_argument("-m",type=str,action='store',dest="move",default="", + help="Move folders to a given subfolder, instead of deleting. WARNING: MOVES FILES WITHOUT ASKING. Moving is only sensible within the same filesystem.") + parser.add_argument('startpath', action="store",default='.', nargs='?') + + options=parser.parse_args() + if options.move!="": + options.force=False + if not options.move.endswith("/"): + options.move+="/" + if (not options.logs) and (not options.execs): + print("Nothing to do, not printing logs, nor execution folders") + sys.exit(1) + return options + + +def delete_folder(folder): + # Delete folder if it exists + if os.path.exists(folder): + shutil.rmtree(folder) + +def move_folder(folder,options): + # Move a folder to a location, with folder name flattened /->_ + if not os.path.exists(options.move): + os.makedirs(options.move) + new_name=folder + while new_name.startswith(".") or new_name.startswith("/"): + new_name=new_name[1:] + new_name=new_name.replace("/","_") + sys.stdout.write(new_name) + new_name=os.path.join(options.move,new_name) + if os.path.exists(new_name): + sys.stdout.write(" Folder already exists! Not moving.") + return + shutil.move(folder, new_name) + +def recurse(options): + + for path,dirs,files in os.walk(options.startpath,followlinks=options.symlinks): + # do not move files in move folder a second time.. + if options.move!="": + if os.path.samefile(options.move, path): + del dirs[:] + continue + take_action=False + if options.logs: + if LOGFILE in files: + take_action=True + if EXECFILE in files: + del dirs[:] + # never descend in to execution directories + if options.execs: + take_action=True + + if take_action: + del dirs[:] + sys.stdout.write(path) + # only one of the following will be true: + if options.force: + sys.stdout.write(" Deleting") + delete_folder(path) + if options.move!="": + sys.stdout.write(" -> "+options.move) + move_folder(path,options) + sys.stdout.write("\n") + else: + #Recurse with cleaned out dirs + dirs.sort() + dirs=clean_dirs(dirs) + + return + +def clean_dirs(dirs): + # removes hidden folders + for s in dirs[:]: + if (s.startswith(".")): + dirs.remove(s) + return dirs + +def main(): + options=setup_options(); + recurse(options) + sys.exit(0) + +main() +