#!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import ( absolute_import, division, print_function, unicode_literals ) from nine import ( IS_PYTHON2, basestring, chr, class_types, filter, integer_types, implements_iterator, implements_to_string, implements_repr, input, iterkeys, iteritems, itervalues, long, map, native_str, nine, nimport, range, range_list, reraise, str, zip ) argparse = nimport('argparse') fnmatch = nimport('fnmatch') os = nimport('os') sys = nimport('sys') time = nimport('time') def run(): """Runs this program. The program removes unneeded files from a directory. """ start_time = time.time() options = parse_cmd_line() rm_unneeded_files(options['directory'], options['verbose']) if options['verbose']: print('Done, in {} seconds!'.format(time.time() - start_time)) def parse_cmd_line(): """Parses the command-line arguments. Arguments: None Returns: A dictionary with each of the supplied command-line arguments. """ parser = argparse.ArgumentParser( description=' '.join([ 'Removes any unneeded files found', 'in the given directory or any subdirectory'])) parser.add_argument( 'directory', help='specify the directory containing unneccessary files') parser.add_argument( '--verbose', '-v', action='store_true', default=False, help='specify this to display verbose output') # vars() turns Namespace into a regular dictionary options = vars(parser.parse_args()) options['directory'] = chomp_sep(options['directory']) + os.sep return options def chomp_sep(dir_name): """Removes any trailing directory separator characters from the given directory name. Arguments: dir_name: the name that has to have any trailing slashes removed Returns: The directory name with no trailing separator characters """ while dir_name.endswith(os.sep): dir_name = dir_name[:-1] return dir_name def rm_unneeded_files(dir_name, verbose): """Removes unneeded files under directory dir_name. Arguments: dir_name: the root directory under which to search for unneccessary files to delete verbose: whether to output text describing non-fatal events Returns: None """ _fnmatch = fnmatch.fnmatch for tupl in os.walk(dir_name): dir_name = tupl[0] # (dir, subdirs, filenames) for fname in tupl[2]: if (_fnmatch(fname, '*~') or _fnmatch(fname, '*.#') or _fnmatch(fname, '#*#') or _fnmatch(fname, '*.sw?') or _fnmatch(fname, '*.autosave') or _fnmatch(fname, '*.DS_Store') or _fnmatch(fname, '*.lein_failures') or _fnmatch(fname, '*.lein-repl-history') or _fnmatch(fname, '*.lisp-temp') ): dir_fname = os.path.join(dir_name, fname) try: os.remove(dir_fname) if verbose: print("Removed: '{}'".format(dir_fname)) except OSError as err: print( "Unable to remove: '{}' => {}".format( dir_fname, err), file=sys.stderr) if __name__ == '__main__': run()