After, for example, re-encoding your videos, you often have a bunch of files in the same directory named e.g. MyMovie.avi
and MyMovie.avi.mkv
.
The following script will sort all files with the same prefix (MyMovie
) into a directory called like the prefix. This allows easy sorting and comparing of those files.
Other files will not be touched. The operation is performed non-recursively and no files will be overwritten.
Note that the list of file extensions is hardcoded and double extensions such as .avi.mkv
are also treated like standard extensions. The extension check is performed using .endswith()
#!/usr/bin/env python3 import argparse import os from collections import defaultdict if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("directory", help="path to the directory") args = parser.parse_args() directory = args.directory extensions = [ ".avi", ".mkv", ".mp4" ] # Add extensions such as ".avi.mp4" at the front # so we check them first extensions = [e1 + e2 for e1 in extensions for e2 in extensions] + extensions files_by_prefix = defaultdict(list) for file in os.listdir(directory): # Split extension for potential_extension in extensions: if file.endswith(potential_extension): file_prefix = file[:-len(potential_extension)] files_by_prefix[file_prefix].append(file) # Ignore prefixes with only one file files_by_prefix = {k: v for k, v in files_by_prefix.items() if len(v) > 1} # Create directory for every prefix and move all the files into it for prefix, files in files_by_prefix.items(): os.makedirs(os.path.join(directory, prefix), exist_ok=True) # Move file using if destination doesn't exist for file in files: print(f"{file} -> {prefix}/{file}") os.rename(os.path.join(directory, file), os.path.join(directory, prefix, file))