Ich habe versucht mir mittels Bash Script die Arbeit etwas zu erleichtern. Ich habe manchmal mehrere Dateianhänge (>20) die ich per E-Mail versenden muss. Hierbei nervt es einfach immer auf die Gesamtgröße der Mailanhänge zu schauen um die maximale Mailgröße nicht zu überschreiten.

Funktionsweise:

Eingabeabfrage:

    Maximale E-Mail-Größe (in MB)

    Quellordner für PDFs

    Automatische Erstellung eines Zielordners (PDF_Mail_Pakete)

Dateiverarbeitung:

    Findet alle PDFs im Quellordner

    Sortiert sie absteigend nach Größe

    Packt Dateien in Gruppen, bis das Größenlimit erreicht ist

    Überspringt einzelne Dateien, die zu groß sind

Ausgabe:

    Erstellt nummerierte Mail-Ordner (Mail_1, Mail_2, etc.)

    Kopiert PDFs in die entsprechenden Ordner

    Erstellt Dateiliste.txt mit den enthaltenen Dateien

    Zeigt Fortschritt mit formatierten Dateigrößen an

Features:

Automatische Größenberechnung in MB

Überspringen zu großer Einzeldateien mit Warnung

Fortschrittsanzeige während der Verarbeitung

Fehlerbehandlung bei ungültigen Eingaben

Behandlung von Dateinamen mit Leerzeichen/Sonderzeichen

Klare Zusammenfassung nach Abschluss

Verwendung:

Skript als pdf-mailer.sh speichern

Ausführbar machen: chmod +x pdf-mailer.sh

Ausführen: ./pdf-mailer.sh

Anweisungen folgen

Beispielausgabe:

Mails mit 20MB max. Anhanggröße

Mail_1 erstellt: 19.84 MB
Mail_2 erstellt: 18.76 MB

Fertig! Es wurden 2 Pakete erstellt.
Alle Dateien befinden sich in: ‚/home/user/dokumente/PDF_Mail_Pakete‘

Jeder Mail-Ordner enthält:

Die zugehörigen PDF-Dateien

Eine Dateiliste.txt mit den Dateinamen

Falls jemand ein für mich sehr nützliches Script benötigt kann das Script gerne testen.

Da hier ich hier keine Dateien hochladen kann.
Hier das Script:

#!/bin/bash

# Funktion zur Formatierung von Bytes in MB
format_mb() {
    echo "$1" | awk '{printf "%.2f MB", $1/1048576}'
}

# Maximale Größe pro Mail abfragen
read -p "Maximale Größe pro Mail (in MB): " max_size_mb

# Validierung der Eingabe
if ! [[ "$max_size_mb" =~ ^[0-9]+$ ]] || [[ "$max_size_mb" -le 0 ]]; then
    echo "Ungültige Eingabe! Bitte eine positive Zahl eingeben."
    exit 1
fi

# Umrechnung in Bytes
max_size_bytes=$((max_size_mb * 1024 * 1024))

# Quellordner auswählen
read -e -p "Pfad zum PDF-Quellordner: " source_dir
if [[ ! -d "$source_dir" ]]; then
    echo "Fehler: '$source_dir' ist kein gültiges Verzeichnis!"
    exit 1
fi

# Zielordner erstellen
target_dir="$source_dir/PDF_Mail_Pakete"
mkdir -p "$target_dir" || exit 1

# PDF-Dateien finden und sortieren
mapfile -t pdf_files < <(find "$source_dir" -maxdepth 1 -type f -iname "*.pdf" -exec du -b {} + | sort -rh)

# Variablen initialisieren
declare -a current_group
current_group_size=0
group_counter=1

# Verarbeitungsfunktion
process_group() {
    group_dir="$target_dir/Mail_${group_counter}"
    mkdir -p "$group_dir" || return 1
    
    # PDFs kopieren und Liste erstellen
    for file in "${current_group[@]}"; do
        cp "$file" "$group_dir/" || return 1
        basename "$file" >> "$group_dir/Dateiliste.txt"
    done
    
    echo "Paket $group_counter erstellt: $(format_mb $current_group_size)"
    ((group_counter++))
    current_group=()
    current_group_size=0
}

# Hauptverarbeitung
for entry in "${pdf_files[@]}"; do
    file_size=$(echo "$entry" | awk '{print $1}')
    file_path=$(echo "$entry" | cut -f2-)
    
    # Prüfe auf zu große Einzeldateien
    if [[ "$file_size" -gt "$max_size_bytes" ]]; then
        echo "Warnung: '$file_path' ist zu groß ($(format_mb $file_size)) und wird übersprungen!"
        continue
    fi

    # Füge Datei zur aktuellen Gruppe hinzu
    if [[ $((current_group_size + file_size)) -le $max_size_bytes ]]; then
        current_group+=("$file_path")
        ((current_group_size += file_size))
    else
        process_group || exit 1
        current_group+=("$file_path")
        current_group_size="$file_size"
    fi
done

# Restliche Dateien verarbeiten
if [[ "${#current_group[@]}" -gt 0 ]]; then
    process_group || exit 1
fi

# Zusammenfassung
echo -e "\nFertig! Es wurden $((group_counter - 1)) Pakete erstellt."
echo "Alle Dateien befinden sich in: '$target_dir'"

Categories:

Schreibe einen Kommentar

Eine Reaktion

Neue Themen im Forum
Network Data Usage Monitor wie ri …Hallo zusammen, habe das Tool Network Data Usage Monitor von Ci … Weiterlesen
Keine Berechtigung für Dateianhan …Hallo habe versucht ein Bash-Script bei einem Beitrag hinzuzufügen … Weiterlesen
Wer kennt es nicht mehrere Dateia …Ich habe versucht mittels Bash Script die Arbeit etwas zu erleicht … Weiterlesen
Kategorien im Wiki
WIKI-Beiträge des Monates

Die Beiträge des Monates finden Sie im Kalender unter den blau markierten Tageszahlen.

Juni 2025
M D M D F S S
 1
2345678
9101112131415
16171819202122
23242526272829
30  
Archive