Lange Verzeichnis- und Dateinamen mit Python kürzen

Dieses Python-Skript nimmt einen Verzeichnispfad und scannt dann jede Datei und jedes Unterverzeichnis darin, sucht nach Dateinamen oder Verzeichnisnamen, die eine angegebene Länge überschreiten. Sobald gefunden, kürzt das Skript diese Namen auf die gewünschte Länge und hängt eine Ellipse (z.B. ...) an, um die Kürzung anzuzeigen. Die Schönheit dieses Skripts liegt in seiner Konfigurierbarkeit und den darin eingebetteten Sicherheitsfunktionen.

Hinweis: Die Verwendung dieses Skripts wird Informationen verlieren (da die neuen Dateinamen kürzer sind und alle wichtigen Informationen im Rest des Dateinamens für immer verloren gehen). Zusätzlich könnte es Informationen auf andere Weise verlieren. Obwohl wir es sorgfältig getestet haben, könnte es Ihre Daten auf unerwartete Weise zerstören. Verwenden Sie ein

Verwendung

Das Skript bietet die folgenden Kommandozeilen-Optionen:

FixLongFilenames_usage.txt
usage: FixLongFilenames.py [-h] [-n LENGTH] [--ellipsis ELLIPSIS] [--dry] directory

Shorten long filenames and directory names.

positional arguments:
    directory             The directory to process.

options:
    -h, --help            show this help message and exit
    -n LENGTH, --length LENGTH
                                                The maximum allowable length for directory or file names.
    --ellipsis ELLIPSIS   The ellipsis to use when shortening.
    --dry                 Dry run mode, only log what would be renamed without actual renaming.

Quellcode

FixLongFilenames.py
#!/usr/bin/env python3
import os
import argparse

def shorten_path(path, max_length, ellipsis, dry_run):
    if os.path.isdir(path):
        base_name = os.path.basename(path)
        if len(base_name) > max_length:
            new_name = base_name[:max_length] + ellipsis
            new_path = os.path.join(os.path.dirname(path), new_name)
            if not os.path.exists(new_path):
                if dry_run:
                    print(f"[DRY RUN] Directory would be renamed: {path} -> {new_name}")
                else:
                    os.rename(path, new_path)
                    print(f"Renamed directory: {path} -> {new_name}")
                return new_path
    else:
        base_name, ext = os.path.splitext(os.path.basename(path))
        if len(base_name) > max_length:
            new_name = base_name[:max_length] + ellipsis + ext
            new_path = os.path.join(os.path.dirname(path), new_name)
            if not os.path.exists(new_path):
                if dry_run:
                    print(f"[DRY RUN] File would be renamed: {path} -> {new_name}")
                else:
                    os.rename(path, new_path)
                    print(f"Renamed file: {path} -> {new_name}")
                return new_path
    return path

def iterate_and_shorten(directory, max_length, ellipsis, dry_run):
    for root, dirs, files in os.walk(directory, topdown=False):
        for dname in dirs:
            dpath = os.path.join(root, dname)
            shortened_path = shorten_path(dpath, max_length, ellipsis, dry_run)
            dirs[dirs.index(dname)] = os.path.basename(shortened_path)

        for fname in files:
            fpath = os.path.join(root, fname)
            shorten_path(fpath, max_length, ellipsis, dry_run)


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Shorten long filenames and directory names.")
    parser.add_argument('directory', help="The directory to process.")
    parser.add_argument('-n', '--length', type=int, default=100, help="The maximum allowable length for directory or file names.")
    parser.add_argument('--ellipsis', default="...", help="The ellipsis to use when shortening.")
    parser.add_argument('--dry', action="store_true", help="Dry run mode, only log what would be renamed without actual renaming.")
    args = parser.parse_args()

    iterate_and_shorten(args.directory, args.length, args.ellipsis, args.dry)

Check out similar posts by category: Python