Как группировать файлы с одинаковым префиксом, но разными расширениями, в папки с использованием Python

После, например, перекодирования ваших видео, у вас часто есть куча файлов в одном каталоге с именами, например, MyMovie.avi и MyMovie.avi.mkv.

Следующий скрипт отсортирует все файлы с одинаковым префиксом (MyMovie) в каталог, названный по префиксу. Это позволяет легко сортировать и сравнивать эти файлы.

Другие файлы не будут затронуты. Операция выполняется нерекурсивно, и никакие файлы не будут перезаписаны.

Обратите внимание, что список расширений файлов жёстко закодирован, и двойные расширения, такие как .avi.mkv, также обрабатываются как стандартные расширения. Проверка расширения выполняется с использованием .endswith()

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

Check out similar posts by category: Python