Python-Skript zum Verteilen von Dateien in einem Ordner in mehrere Unterverzeichnisse

Dieses Python-Skript verteilt Dateien in einem Ordner in mehrere Unterverzeichnisse und stellt sicher, dass ungefähr die gleiche Anzahl von Dateien in jedem Unterordner ist. Dies ermöglicht das Handling von Verzeichnissen mit Millionen von Dateien sogar mit Tools, die Probleme mit großen Verzeichnissen haben.

distribute_files.py
#!/usr/bin/env python3
import os
import shutil
from math import ceil
import argparse
from tqdm import tqdm  # Neue Import-Zeile

def main():
    parser = argparse.ArgumentParser(description="Distribute files from a directory into subdirectories.")
    parser.add_argument("directory", type=str, help="Path to the directory containing files.")
    parser.add_argument("-n", "--num-folders", type=int, default=10, help="Number of subdirectories to create.")
    parser.add_argument("--dry-run", action="store_true", help="Show what would be done without making any changes.")

    args = parser.parse_args()

    directory = args.directory
    num_folders = args.num_folders
    dry_run = args.dry_run

    if num_folders <= 0:
        print("Error: The number of folders must be a positive integer.")
        return

    if not os.path.isdir(directory):
        print(f"Error: {directory} is not a valid directory.")
        return

    # List and sort files in the directory
    files = [f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f))]
    files.sort()

    if not files:
        print("No files found in the directory.")
        return

    # Calculate files per folder
    files_per_folder = ceil(len(files) / num_folders)

    # Create subdirectories and distribute files
    total_operations = len(files)  # Gesamtzahl der zu bewegenden Dateien
    with tqdm(total=total_operations, desc="Moving files") as pbar:
        for i in range(1, num_folders + 1):
            subdir = os.path.join(directory, str(i))
            if not dry_run:
                os.makedirs(subdir, exist_ok=True)
            else:
                print(f"Would create directory: {subdir}")

            start_index = (i - 1) * files_per_folder
            end_index = start_index + files_per_folder
            files_to_move = files[start_index:end_index]

            for file in files_to_move:
                src = os.path.join(directory, file)
                dest = os.path.join(subdir, file)
                if not dry_run:
                    shutil.move(src, dest)
                else:
                    print(f"Would move {src} to {dest}")
                pbar.update(1)  # Fortschrittsbalken nach jeder Datei aktualisieren

    if not dry_run:
        print(f"Files successfully distributed into {num_folders} folders.")
    else:
        print("Dry run completed. No files were actually moved.")

if __name__ == "__main__":
    main()

Check out similar posts by category: Python