A script to remove whitespaces and other funky characters from filenames.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

90 lines
2.6 KiB

#!/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)