#!/usr/bin/env python3 import sys from os import rename from argparse import ArgumentParser from normalisename import Normalisename if __name__ == '__main__': # parse arguments parser = ArgumentParser(description='Eliminate funky stuff from filenames.') parser.add_argument( '--separator', '-s', type=str, nargs='?', default='_', help='Set separator to use (to replace spaces with).' ) parser.add_argument( '--allow', '-a', type=str, nargs='?', action='append', help='Specify a special character to allow (it will not be removed).' ) parser.add_argument( '--disallow', '-d', type=str, nargs='?', action='append', help='Specify a special character to disallow (it will removed).' ) parser.add_argument( '--whitelist', '-w', type=str, help='Overwrite default whitelist (format: whitespace separated string).' ) mgroup = parser.add_mutually_exclusive_group() mgroup.add_argument( '--dryrun', '-n', action='store_true', help='Do not touch anything, just tell me what would change!' ) mgroup.add_argument( '--funky', '-f', action='store_true', help='List filenames with special characters' ) mgroup.add_argument( '--check', '-c', action='store_true', help='Check whether a name is normalised or not' ) parser.add_argument( 'files', type=str, nargs='+', help='File(s) to normalise the name of (relative or absolute path).' ) args = parser.parse_args() # verify arguments if args.disallow: if args.separator in args.disallow: sys.exit('Disallowing your chosen separator makes no sense!') # declare special characters that will not be removed whitelist = {'.', '-'} if args.whitelist: whitelist = set(args.whitelist.split()) # modify whitelist based on arguments if args.allow: whitelist = whitelist.union(set(args.allow)) if args.disallow: whitelist = whitelist.difference(set(args.disallow)) # define operations def listchanges(before, after): print( f'⤺ {before}\n' f'⤻ {after}\n' ) def listfunky(before, _): print(before) def checkname(before, after): if before != after: sys.exit(1) sys.exit(0) operation = rename if args.dryrun: operation = listchanges elif args.funky: operation = listfunky elif args.check: operation = checkname # do what needs to be done Normalisename(args.separator, whitelist, operation)(args.files)