staging.inyokaproject.org

Script zum Extrahieren von Mailanhängen

Status: Ungelöst | Ubuntu-Version: Ubuntu 16.04 (Xenial Xerus)
Antworten |

ralfoertner

Anmeldungsdatum:
17. Februar 2018

Beiträge: 31

Hallo Shellscript Profis!

Ich bin leider keiner!!! Deshalb bitte ich euch um Hilfe!

Ich habe ein Script mit viel Mühe und ständigem Googeln zusammengestrickt, das weitgehend tut was es soll.

Ich schildere kurz was gemacht werden soll.

Auf einem Ubuntu-Xenial läuft ein Postfix/Dovecot zur Zufriedenheit. Einige Mailuser schicken PDF-Dateien als Anhang. Diese Dateien sollen extrahiert werden und mit Kundennummer versehen in einem Processing-Ordner in einem Unterverzeichnis das so heisst wie die Kundennummer abgelegt werden. Am Schluß sollen die Mails aus dem Postfach gelöscht werden.

Ich verwende um die Mailanhänge zu extrahieren RIPMIME, damit bin ich leidlich zufrieden. Um die Dateien mit der Kundennummer zu versehen verwende ich MMV.

Manuell durchgeführt ist alles ok.

Ich habe allerdings und das ist eine meiner Fragen: Schwierigkeiten das Suchkriterium im Findbefehl als Variable anzugeben (ich weiß nicht welche Syntax ich benutzen muss).

Die zweite Frage betrifft MMV auch hier muß ich eine Pfadangabe und das Kriterium zum umbenennen der PDF-Dateien als Variable angeben und ich scheitere ebenso.

Außerdem habe ich das Variablenhandling in For-Schleifen anscheinend noch nicht richtig verstanden. Das Zuweisen von Werten hat nicht funktioniert wie ich es erwartet habe.

Nachfolgend das kleine Möchtegern Script:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

#!/bin/bash

pfad=/var/vmail/mailboxes/global-vat-refund.com/
folder=()
kunde=ds_
pfad_zum_processing_folder=/var/opt/processing/
kundenverzeichnis_im_processing_folder=$pfad_zum_processing_folder$kunde

#Kundenverzeichnis im Processing-Folder erstellen (falls  noch nicht vorhanden)
#mkdir -p $kundenverzeichnis_im_processing_folder

# In Mailboxverzeichnis wechseln
cd $pfad

# Verzeichnisnamen einlesen
while IFS= read -r -d $'\0'; do
    folder+=("$REPLY")
done < <(find . -name "ds_*" -type d -printf '%f\n' -print0)           ----- Frage wie definiere ich den Suchbegriff im Beispiel "ds_*" als Variable $kunde ???

# Eingelesene Verzeichnisse mit Ripmime bearbeiten
for i in ${folder[@]}; do
        echo $i
        kundenverzeichnis_im_processing_folder=/var/opt/processing/$i
        mkdir -p $kundenverzeichnis_im_processing_folder
        echo $kundenverzeichnis_im_processing_folder
        ripmime -i $i/mail/cur -d $kundenverzeichnis_im_processing_folder --syslog | mmv $kundenverzeichnis_im_processing_folder "*.pdf" "$i_#1.pdf"  ---- Frage: wie übergebe ich mmv die Ersetzungsparameter als Variable oder sollte ich etwas anderes als MMV verwenden

done
Code

Vielen Dank für eure Hilfe! Für Verbesserungsvorschläge bin dankbar!!!

MfG RO

huarg

Anmeldungsdatum:
30. Juli 2012

Beiträge: Zähle...

 -- Frage wie definiere ich den Suchbegriff im Beispiel "ds_*" als Variable $kunde ??? 

Einfach in Variable abspeichern, allerdings muss man das globbing abschalten, sonst wird das schon bei deklaration ausgeführt.

set -o noglob    # globbing ausschalten
muster1=*.pdf'
muster2='blabla*'
set +o noglob    # globbing wieder einschalten

Für den Kunden ist das aber gar nicht nötig siehe unten die for-schleife

Was die pipe zwischen ripmime und mmv soll verstehe ich nicht ganz, ich kenne die tools auch nicht, was die bei mehrere Dateien in einem Anhang machen. Wenn mehrere PDFs angehängt sind müsste er mehrere Dateien anlegen wenn du das pipest ist kann er die Grenzen nicht erkennen. Das müsssen vermutlich zwei Aufrufe sein ripmime ... mmv ...

Das Arbeitsverz. würde nach jedem user auch komplett löschen, fals noch andere Anhänge dabei waren.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
pfad=/var/vmail/mailboxes/global-vat-refund.com/
folder=()
kunde=ds_
pfad_zum_processing_folder=/var/opt/processing/
kundenverzeichnis_im_processing_folder=$pfad_zum_processing_folder$kunde

cd $pfad
for verz in ${kunde}*   # hole alle dateien die mit ds_ anfanen was vermutlich dirs sind
do
  if [ -d "$verz" ]     # wir checken nochmal ob es auch ein dir ist, sonst tauchen aus normale dateien mit ds_ auf
   kundenverzeichnis_im_processing_folder=/var/opt/processing/"$verz"
   mkdir -p "$kundenverzeichnis_im_processing_folder"
   echo "$kundenverzeichnis_im_processing_folder"

   ripmime -i "$verz"/mail/cur -d $kundenverzeichnis_im_processing_folder --syslog | mmv $kundenverzeichnis_im_processing_folder "*.pdf" "$verz_#1.pdf"  
   # oder hier vermutlich 
   #  ripmime ... 
   #  mmv ...
  fi 
done

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

@huarg: Das globbing in dem Beispiel abschalten macht keinen Sinn, denn bei der Zuweisung passiert gar kein globbing:

$ a=*
$ echo "$a"
* 

Man kann Muster also problemlos an Variablen zuweisen. Selbst wenn man das nicht könnte, würden die Anführungszeichen verhindern dass ”geglobt” wird.

Das cd sollte unbedingt dagegen abgesichert werden das es fehlschlagen kann. Dann würde die nachfolgende Schleife in einem ganz anderen Verzeichnis ausgeführt, wo sie vielleicht Schaden anrichten kann.

Den Test auf Verzeichnis kann man sich sparen wenn man das Muster in der for-Schleife mit einem Schrägstrich enden lässt, denn dann geht die Schleife nur über Verzeichnisnamen.

huarg

Anmeldungsdatum:
30. Juli 2012

Beiträge: Zähle...

Marc_BlackJack_Rintsch schrieb:

Man kann Muster also problemlos an Variablen zuweisen. Selbst wenn man das nicht könnte, würden die Anführungszeichen verhindern dass ”geglobt” wird.

Dachte ich auch erst bei mir ist es aber so, selbst mit " " und ' ' wird geglobbed, das muss man explizit ausschalten.

#!/bin/bash
echo -n "default mit \"\":";   foo="bla*"; echo $foo;
echo -n "default mit '':";     foo='bla*'; echo $foo;
echo -n "default ohne alles:"; foo=bla*;   echo $foo;

echo "globbing on:"; set +o noglob; foo="bla*"; echo $foo; 

echo "globbing off:"; foo="bla*"; set -o noglob; echo $foo

Ergibt:

default mit "":bla1 bla2
default mit '':bla1 bla2
default ohne alles:bla1 bla2
globbing an:
bla1 bla2
globb off:
bla*

Ah jetzt weiss ich was hier nicht stimmt

 echo "$foo" 

muss es heissen. Siehe http://teaching.idallen.com/cst8207/13w/notes/320_shell_variables.html#double-quote-all-uses-of-variables

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

@huarg: Genau, das globbing passiert bei Deinen Beispielen nicht bei der Zuweisung, sondern wenn Du das Muster dann ”ungeschützt” an echo übergibst.

ralfoertner

(Themenstarter)

Anmeldungsdatum:
17. Februar 2018

Beiträge: 31

Danke für eure Tipps!!

Ich bin jetzt ein Stück weiter:

mmv -r "$kundenverzeichnis_im_processing_folder/*.pdf" $ersatzname

Mein Problem ist jetzt die Variable $ersatzname.

Ich habe zugewiesen: echo ersatzname=$i#1.pdf (i ist eine Schleifenvariable und enthält den Verzeichnisnamen in korrekter Notation bsbw. ds_30000 ist die Ausgabe von echo $ersatzname.

Verwende ich aber die Variable wie oben im Beispiel mit mmv wird aus $ersatzname ./ds_30000 (also ./ wird hinzugefügt) wie kann ich das ändern/verhindern???

Und warum passiert das überhaupt???

Nochmal Danke im voraus!!

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

@ralfoertner: Was ist denn Dein Problem mit dem ./? Das ändert doch effektiv nichts an dem relativen Pfad ob man nun noch ein ./ davor setzt oder nicht. ./xyz führt zum gleichen Eintrag im Dateisystem wie nur xyz.

Wobei $i#1.pdf eigentlich zu ./ds_30000.pdf führen sollte wenn $i den Wert ds_ hatte und es eine Datei mit dem Namen 30000.irgendwas im Quellverzeichnis gibt.


Edit: Okay, ich habe das -r bei mmv übersehen. Da sollte das nicht passieren. Tut es bei mir auch nicht. Kannst Du mal ein minimales, nachvollziehbares Beispiel zeigen bei dem das bei Dir passiert?


Edit2: Es passiert natürlich wenn das aktuelle Verzeichnis dasjenige welche ist, in dem die Umbenennungen stattfinden und das ./ auch in dem Muster für die Quellen so drin steht.

1
2
3
$ mmv -r -n './*.java' 'ds_#1.pdf'
./DosDate.java -> ./ds_DosDate.pdf
./Test.java -> ./ds_Test.pdf
Antworten |