automatisches Ablagesystem mit unRaid - etwas Hirnschmalz benötigt

xCtrl

Lt. Commander
Registriert
Dez. 2011
Beiträge
1.569
Guten Abend in die Runde,

ich erarbeite seit ein paar Tagen ein automatisches Ablagesystem für PDF-Dateien - vom Gedanke bis zum jetzigen Zeitpunkt. Als Unterbau kommt unRaid zum Einsatz mit einem Docker Container und einer Debian VM sowie SMB-Freigaben auf dem unRaid.

Die Basis:
  • unRaid 6.9 auf Pentium Mini ITX, 16GB Ram, 8TB Netto-Speicher
  • Docker Container ocrmypdf-auto
  • VM mit Debian Bullseye und installierten "pdfgrep" und Mountpunkt zu einem unRaid Share

Folgender Workflow:

Ordner "Scan-In"
  • wird gefüttert mit "Datei von Hand dort kopieren" oder "PDF-Scan vom Brother Drucker" (quasi eine eigene Dropzone)
  • Docker "ocrmypdf-auto" nimmt sich die Datei, "ocr't" sie durch und packt sie als durchsuchbare PDF in den Ordner "Scan-Out"

Ordner "Scan-Out"
  • durchsuchbare PDF liegt bereit
  • Debian VM nimmt sich die Datei, sucht per "pdfgrep" von mir in einer Datei hinterlegten Schlagwort(e) und benennt sie in diesem Format um: "YYYY-MM-DD-Dateiname_aus_Schlagwort.pdf" (z.B. 2021_Rechnung_Vodafone.pdf)
  • weiter soll in diesem Zuge die Datei in den passenden Ordner verschoben werden. (Beispiel Vodafone im Dateiname -> verschiebe in Ordner "Rechnungen Vodafone") oder ähnlich.

Ordner "Kategorie" (z.B. Rechnungen)
  • hier sollen die PDF-Dateien dann passend nach Schlagwort im Dateinamen landen.
  • unter Windows/Mac/iPad/Linux kann später der Dateiname oder Dateinhalt durchsucht werden

Der Container läuft schon mal und "ocr't" die eingehenden PDFs zuverlässig.

Diese Befehle und Variablen habe ich mir soweit ausgearbeitet und von Hand Schritt für Schritt durchgeführt. Auch das funktioniert wie gedacht.
# Variablen deklarieren
# Pfade festlegen
var_pdfout_path=mnt/unraid/Scan/Out
var_pdfpattern_path=mnt/unraid/Scan/config

# aktuelles Datum in Variable
var_date_now=$(date +%F)

# aktuelle Datei in Variable
var_current_file=$(ls $var_pdfout_path | grep .pdf -m 1)

# Testausgabe Variable
echo "$var_current_file"

# pdfgrep schreibe mir in die Variable aus der PDF Datei anhand von Schlagworten mit der Datei pdf_pattern
var_pdf_str=$(pdfgrep -f $var_pdfpattern_path/pdf_pattern $var_pdfout_path/$var_current_file --max-count 1)

# wenn mehrere Schlagworte gefunden, dampfe sie mir in eine Zeile lesbar zusammen
var_pdf_str=$(echo "$var_pdf_str" | xargs)

# Testausgabe Variable
echo "$var_pdf_str"

# baue mir den neuen Dateinamen zusammen
var_pdf_name="$var_date_now"_"$var_pdf_str".pdf

#Testausgabe Variable
echo "$var_pdf_name"

# benenne die aktualle Datei um
mv "$var_pdfout_path/$var_current_file" "$var_pdfout_path/$var_pdf_name"

# finde Datei mittels Teil von Dateinamen und schiebe sie in den passenden Ordner
find /mnt/unraid/Scan/Out/ -name "Vodafone" | xargs -I '{}' mv '{}' "/mnt/unraid/Scan/Rechnung Vodafone/$pdf_name"

ist halt im Moment eher eine Ansammlung von Befehlen, womit ich mir gerne ein Script bauen mag, welche per cronjob jede Minute ausgeführt wird. Am liebsten wäre mir noch eine Abfrage am Anfang des Scripts, welche den Ordner überwacht und sobald eine PDF Datei dort auftaucht erst anläuft.

Für das Schreiben des Scripts bin ich noch zu doof.... quasi TILT im Hirn aktuell.

Ich bin schon mal froh, dass das Konstrukt an sich funktioniert, wenn auch nicht so flexibel wie ein DMS. Ein DMS wiederrum würde ich für mein Vorhaben eher als Overkill ansehen. Ich kann jeder Zeit meine Datei "pdf_pattern" mit meinen eigenen Schlagworten erweitern, welche dann aber nur neu dazu kommende Dateien berücksichtigen wird - soll für den Anfang erstmal reichen.

Ein paar Fragen habe ich jetzt:

1. ist der Inhalt aus dem Spoiler für ein Script brauchbar? weitere Ideen?
2. wie funktioniert das mit den Cronjobs? Ich habe bis Dato nie einen zum laufen bekommen
3. kann ich mittels UserScript unter unRaid in der Debian VM das Script anstoßen?
4. Ich bin einfach zu doof für Schleifen: Was wäre die beste Methode das Script am Anfang den Ordner "zu überwachen" und erst bei Eingang einer PDF-Datei los zu legen?

Ich hoffe mein Geschreibsel ist soweit verständlich. Wenn nicht, dann bitte ich um Nachfragen sowie konstruktives Feedback und eine rege Diskussion :)

Gruß
Chris
 
Nabend @Noticeiver

das sieht interessant aus. Werde die Tage mich damit auseinander setzen. Danke dir schon mal für den Tipp.
 
Merci für den Tipp mit Organize, ich bin mittlerweile ein gutes Stück weiter gekommen und habe mir mein kleines Ablagesystem gebaut. Der oben aufgezeigte Workflow wird dabei abgebildet.

Der Docker Container arbeitet ohne weitere Anpassungen.

Debian 11 VM als Schnittstelle für
Eigens gebautes Bash-Script als systemd Service und while-loop mit Abfragen wie
  • "ist der Ordner leer oder nicht"
  • "lösche alles was nicht PDF ist aus den Scan-In Ordner" (falls mal was irrtümlich dort rein wandert)
  • mit PDFGrep und zwei .txt Dateien als Index werden Schlagwörter gesucht. Die txt Dateien müssen von Hand gefüttert werden
  • neuer Dateiname wird mit aktuellem Datum + gefundenen Schlagworten zusammen gesetzt
  • PDF Datei wird umbenannt
  • mittels Organize und seiner Config-Datei mit entsprechenden Regeln werden die Datei anhand des Dateinamens in passende Ordner verschoben.

Soviel zur Theorie. Die Praxis zeigt am Anfang, dass es vom Prinzip her klappt, aber das Ganze von den beiden Schlagwortverzeichnissen abhängt, was vorhanden ist und in welcher Reihenfolge.

Bash:
#!/bin/bash

while :
do

# Variablen deklarieren
# Pfade festlegen
var_pdfin_path=/home/pdf/unraid/Scan/In
var_pdfout_path=/home/pdf/unraid/Scan/Out
var_pdfpattern_path=/home/pdf/unraid/Scan/config
var_documents_unsortet=/home/pdf/unraid/Dokumente/#Unsortiert

# bleib 5 Sekunden cool
sleep 5;

while [ "$(ls -A "$var_pdfout_path")" ]
do

# bleib 15 Sekunden cool und warte, bis die Datei vollständig von orcmypdf container übertragen wurde
sleep 15;

find /home/pdf/unraid/Scan/Out -iname '.pdf' -type f -exec
{
# warte 5 Sekunden
sleep 5;

# erstmal alles rauswerfen, was nicht PDF ist
find "$var_pdfin_path" -type f -not -name '*.pdf' -delete

# aktuelle Datei in Variable ohne Dateiendung
var_current_file=$(ls "$var_pdfout_path" | grep .pdf -m 1)

# Testausgabe Variable
echo "$var_current_file" > /home/pdf/log_movepdf.txt

# pdfgrep schreibe mir in die Variable aus der PDF Datei anhand von Schlagworten mit der Datei pdf_pattern
var_pdf_str1=$(pdfgrep -o -f /home/pdf/unraid/Scan/config/pdf_pattern "$var_pdfout_path"/"$var_current_file" --max-count 1)
# pdfgrep schreibe mir in die Variable aus der PDF Datei anhand von Schlagworten mit der Datei pdf_pattern_2
var_pdf_str2=$(pdfgrep -o -f /home/pdf/unraid/Scan/config/pdf_pattern_2 "$var_pdfout_path"/"$var_current_file" --max-count 1)

# setze die gefundenen Schlagwörter zu einer Variable zusammen
var_pdf_str="$var_pdf_str1"_"$var_pdf_str2"

if [ -n "$var_pdf_str" ]
then
# wenn mehrere Schlagworte gefunden, dampfe sie mir in eine Zeile lesbar zusammen
var_pdf_str=$(echo "$var_pdf_str" | xargs -e)
var_pdf_str=$(echo "$var_pdf_str" | sed -n '/[a-zA-Z0-9]/p')

# Testausgabe Variable
echo "$var_pdf_str" >> /home/pdf/log_movepdf.txt

# aktuelles Datum in Variable
var_date_now=$(date +%F)

# baue mir den neuen Dateinamen zusammen
var_pdf_name="$var_date_now"_"$var_pdf_str".pdf

#Testausgabe Variable
echo "$var_pdf_name" >> /home/pdf/log_movepdf.txt

# benenne die aktualle Datei um
mv "$var_pdfout_path"/"$var_current_file" "$var_pdfout_path"/"$var_pdf_name"

# warte noch mal 5 Sekunden
sleep 5;

# verschiebe die Datei mit Organize anhand von Kriterien im Namen
organize run --config-file=/home/pdf/.config/organize/config.yaml >> /home/pdf/log_movepdf.txt

# warte danach 5 Sekunden
sleep 5;
echo "Datei wurde verschoben"

else
# verschiebe die Datei in Unsortiert, wenn keine Kriterien gefunden wurden
mv "$var_pdfout_path"/"$var_current_file" "$var_documents_unsortet"/"$var_current_file"

# warte noch mal 5 Sekunden
sleep 5;
fi
}
done

unset var_pdfin_path
unset var_pdfout_path
unset var_pdfpattern_path
unset var_date_now
unset var_current_file
unset var_pdf_str
unset var_pdf_name
unset var_documents_unsorted

# cooldown 5 Sekunden
sleep 5;

done

ich weiß, eine Menge Arbeit, die sonst ein DMS übernehmen könnte - allerdings wegen Einsatz von Datenbanken etwas overkill. Mit meiner Methode, die zugegeben etwas unflexibler ist als ein DMS, arbeitet halt nur eine Freigabe und aktuell die Windows eigene Explorer Suche mit der eingeschalteten Suchoption "Dateiinhalte". Ich meine z.B. Catfish unter Linux kann auch Dateiinhalte durchsuchen. Wie sieht es bei durchsuchbaren PDF-Dateien aus?

Grüße und einen guten Rutsch euch
Chris
 
Zuletzt bearbeitet:
Zurück
Oben