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'"
            
            
Eine Reaktion
Sehr nett, danke 🙂