Copy directories while excluding or isolating certain extensions
Is the use of global sys.argv in include() and refuse() ok?



At the moment it's not really readable, since sys.argv[4] doesn't say much... This could be solved by using argparse or naming your sys.argv to variables



  How can I handle the different ways a user might use the script in the best possible way? Not quite happy about the if statements in the __main__.



Use argeparse that will relieve the clutter from the if __name__ == '__main__' and make it easier to add optional parameters in your script.

def parse_arguments():
    """Arguments parser."""

    parser = argparse.ArgumentParser(usage='%(prog)s [optional] &lt;source&gt; &lt;destination&gt;',
                                 description='Copy master',
                                 formatter_class=argparse.RawDescriptionHelpFormatter,
                                 epilog='''&lt;your help string&gt;''')

    # Next you can add arguments like this...
    parser.add_argument('source', type=str, help='source directory')
    parser.add_argument('destination', type=str, help='destination directory')
    parser.add_argument('-t', '--types', type=str, help='included types')
    ...

    # Parse the arguments to the object
    args = parser.parse_args()

    # Check if all args are set or something
    if not args.types:
        parser.error('No typyes are specified')
    return args

# Now you can call this from the main
if __name__ == '__main__':
    import argparse
    args = parse_arguments()
    # And call your arguments like...
    # args.source, etc...





Bonus


imports should be at the top of the file! 

At the moment when this script is imported to another module, it will not import all dependencies.

Note that you can import argparse in __main__, since this will on be executed from the cli
(Subjective style) You might consider to chop lines for better readability


return [f for f in files if any(f.endswith('.' + x) for x in sys.argv[4].split(',')) and not os.path.isdir(os.path.join(d, f))]



Could be this:

return [file
        for file in files if any(file.endswith('.' + x)
        for x in sys.argv[4].split(','))
        and not os.path.isdir(os.path.join(d, f))]

At your help string consider using a heredoc string 

"""Heredoc string""" Or consider setting it as the docstring __doc__ = """Help"""