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 🙂