#!/usr/bin/env python3 from unidecode import unidecode from os import rename from os.path import basename, dirname from os.path import join as joinpath from argparse import ArgumentParser 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('--whitelist', '-w', type=str, help='Overwrite default whitelist (format: whitespace separated string).') parser.add_argument('files', type=str, nargs='+', help='File(s) to normalise the name of (relative or absolute path).') args = parser.parse_args() # special characters that will not be removed whitelist = {' ', '.', '-'} if args.whitelist: whitelist = set(args.whitelist.split()) whitelist.add(args.separator) if args.allow: whitelist = whitelist.union(set(args.allow)) for path in args.files: dir = dirname(path) file = basename(path) rename(path, unidecode ( joinpath ( dir, ''.join(ch for ch in file.replace(' ', args.separator) if ch.isalnum() or ch in whitelist) ) ))