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