Hi Gemeinde,
in einem großen Baum mit vielen Dateien (PDF) muss ich sicherstellen, dass mein Bash Skript jede Datei nur einmal anfasst und dann weiss "da war ich schon" wenn es am Nächsten Tag nochmals läuft.
Habt Ihr Rat?
Jede Datei nur einmal bearbeiten (make?)
-
- Beiträge: 15
- Registriert: 10.06.2009 08:39:03
Re: Jede Datei nur einmal bearbeiten (make?)
Du wirst diese Hier-war-ich-schon-Information in irgendeiner Weise persistent speichern muessen. Dafuer gibt es verschiedene Moeglichkeiten. U.a. kannst du wenn du eine Datei besuchst:
- ihren Dateinamen in eine Textdatei schreiben
- fuer sie *eine Art* Lock-Datei anlegen
- ihr Sticky-Bit setzen (weil das normalerweise egal ist)
Beim Durchlaufen des Verzeichnisbaums musst du dann jede Datei zuvor mit der gewaehlten Methode pruefen.
make hilft dir in diesem Fall nur etwas wenn du den So-eine-Art-Lockfile-Ansatz waehlst, allerdings eignet sich make schlecht fuer beliebige/unbekannte Verzeichnis-Verschachtelungen.
Ich verwende fuer einen aehnlichen Anwendungsfall den Ansatz mit der Textdatei:
- ihren Dateinamen in eine Textdatei schreiben
- fuer sie *eine Art* Lock-Datei anlegen
- ihr Sticky-Bit setzen (weil das normalerweise egal ist)
Beim Durchlaufen des Verzeichnisbaums musst du dann jede Datei zuvor mit der gewaehlten Methode pruefen.
make hilft dir in diesem Fall nur etwas wenn du den So-eine-Art-Lockfile-Ansatz waehlst, allerdings eignet sich make schlecht fuer beliebige/unbekannte Verzeichnis-Verschachtelungen.
Ich verwende fuer einen aehnlichen Anwendungsfall den Ansatz mit der Textdatei:
Code: Alles auswählen
for i in `ls "$path"` ; do
if fgrep -x "$i" "$sentlist" >/dev/null ; then
continue
fi
sendfile "$i" && echo "$i" >>"$sentlist"
done
Use ed once in a while!
- heisenberg
- Beiträge: 4123
- Registriert: 04.06.2015 01:17:27
- Lizenz eigener Beiträge: MIT Lizenz
Re: Jede Datei nur einmal bearbeiten (make?)
Ja. Hört sich definitiv nach einem Fall für make an.
Gibt es denn Ergebnisdateien, die in 1:1 Beziehung zu den PDF-Dateien stehen? Damit könnte make erkennen: Ja: Ergebnisdatei ist neuer als PDF-Datei, deswegen muss ich die PDF-Datei nicht mehr verarbeiten.
Beschreibe doch mal etwas genauer, was Du vorhast. Gerne auch mit gut formatierten Darstellungen des Problems, VZ-Struktur, ... dort wo es hilft Deine Aufgabe besser darzustellen.
Gibt es denn Ergebnisdateien, die in 1:1 Beziehung zu den PDF-Dateien stehen? Damit könnte make erkennen: Ja: Ergebnisdatei ist neuer als PDF-Datei, deswegen muss ich die PDF-Datei nicht mehr verarbeiten.
Beschreibe doch mal etwas genauer, was Du vorhast. Gerne auch mit gut formatierten Darstellungen des Problems, VZ-Struktur, ... dort wo es hilft Deine Aufgabe besser darzustellen.
Re: Jede Datei nur einmal bearbeiten (make?)
ich musste bei der Fragestellung an beagle denken (beagle war eine Desktopsuche und sozusagen der Vorgänger von tracker). Das hat in den erweiterten Attributen einer Datei unter anderem gespeichert ob/dass die Datei schon inidziert worden ist.
Die erweiterten Attribute könnte man mit setfattr und getfattr aus attr schreiben und lesen - das setzt natürlich voraus, dass das verwendete Dateisystem erweiterte Attribute kennt, was aber afaik bei allen linuxüblichen Dateisystemen der Fall ist.
Die erweiterten Attribute könnte man mit setfattr und getfattr aus attr schreiben und lesen - das setzt natürlich voraus, dass das verwendete Dateisystem erweiterte Attribute kennt, was aber afaik bei allen linuxüblichen Dateisystemen der Fall ist.
-
- Beiträge: 15
- Registriert: 10.06.2009 08:39:03
Re: Jede Datei nur einmal bearbeiten (make?)
Hallo Leute,
hatte die Antwortmail im Spam...
So wie das duch Euch beschrieben wurde, sin wir schon sehr nahe dran - aber erstmal an Eure Fragen:
- Was mache ich damit.
Hier gibt es eine "Selfmade" Verzeichnis-Struktur, welche tlw. durch Automatismen, tlw. durch Benutzer mit PDF Dateien belegt wird. Aus den unterschiedlichsten Quellen, leider manchmal auch mit PDF und Grfaikinhalt.
Ich lasse nun mit find ein Skript durch alle Bäume laufen, alle gefundenen PDF Dateien werden kurz geprüft ob es einen Textinhalt gibt, wenn ja - macht mein Skript nichts, wenn doch, dann wird tesseract aktiv und holt den Text raus, baut damit ein Neues Ghostscript PDF auf. Funktion ist einwandfrei, nur erkennt er halt nicht deutlich was erledigt ist und was nicht.
Im Idealfall hätte ich so eine Art "Suchdatenbank" der PDF Inhalte, aber da sind wir dann schon zu nahe einem vollwertigen DMS. Das soll auch in den Nächsten Jahren mit SAGE einziehen - aber bis dahin bleibt noch meine Lieblingsbeschäftigung und ich habe die Möglichkeit mit der Bash etwas zu helfen (ist ja nicht so als ob wir nicht Spaß an der Herausforderung hätten, oder )
Skript 1
Skript 2
Tja. Die hier von mir genannte Lösung ist nett - aber es darf auch besser gehen. Daher würde ich es lieber noch einmal von vorne angehen:
Dateisystem ist auf einem QNAP gehosted. EXT4. Der Zugriff kommt per NFS, aber auch emuliert für Windows als NTFS.
Ich kann per SSH an meine AUfgaben gehen und dann EXT4 nutzen oder über die Freigabe als NFS mounten.
WURZEL-VZ/
WURZEL-VZ/POSTEINGANG
WURZEL-VZ/ARCHIV
WURZEL-VZ/VERTRAEGE
Ich denke, so eine Art "Index" gefällt mir gut.
Bin gespannt, wie ihr das lösen würdet.
Liebe Grüße,
Stefan
hatte die Antwortmail im Spam...
So wie das duch Euch beschrieben wurde, sin wir schon sehr nahe dran - aber erstmal an Eure Fragen:
- Was mache ich damit.
Hier gibt es eine "Selfmade" Verzeichnis-Struktur, welche tlw. durch Automatismen, tlw. durch Benutzer mit PDF Dateien belegt wird. Aus den unterschiedlichsten Quellen, leider manchmal auch mit PDF und Grfaikinhalt.
Ich lasse nun mit find ein Skript durch alle Bäume laufen, alle gefundenen PDF Dateien werden kurz geprüft ob es einen Textinhalt gibt, wenn ja - macht mein Skript nichts, wenn doch, dann wird tesseract aktiv und holt den Text raus, baut damit ein Neues Ghostscript PDF auf. Funktion ist einwandfrei, nur erkennt er halt nicht deutlich was erledigt ist und was nicht.
Im Idealfall hätte ich so eine Art "Suchdatenbank" der PDF Inhalte, aber da sind wir dann schon zu nahe einem vollwertigen DMS. Das soll auch in den Nächsten Jahren mit SAGE einziehen - aber bis dahin bleibt noch meine Lieblingsbeschäftigung und ich habe die Möglichkeit mit der Bash etwas zu helfen (ist ja nicht so als ob wir nicht Spaß an der Herausforderung hätten, oder )
Skript 1
Code: Alles auswählen
#!/bin/bash
MYFONTS=$(pdffonts -l 2 "$1" | tail -n +3 | cut -d' ' -f1 | sort | uniq)
if [ "$MYFONTS" = '' ] || [ "$MYFONTS" = '[none]' ]; then
echo "KONVERTIERE: $1"
/freigabe/skripte/ocr-convert.sh $1
else
echo "Konvertiert: $1"
fi
Code: Alles auswählen
# Copyright Alexander Jerneck 2014
# Licensed under the MIT license (http://opensource.org/licenses/MIT)
#!/bin/bash
## Script to batch ocr pdfs, by first converting them to tifs.
for x in $@
do
## pdfseparate to separate the pages
pdfseparate "$x" .tmp-%d.pdf
for f in $(ls .tmp-*.pdf | sort -n -t - -k 2)
do
convert -colorspace Gray -normalize -density 300 -depth 8 -resample 200x200 -background white -flatten +matte "$f" "$f.tif"
tesseract -l deu "$f.tif" "$f.txt"
cat "$f.txt.txt" >> "$x.txt"
rm "$f.tif"
rm "$f.txt.txt"
done
rm .tmp-*.pdf
done
Dateisystem ist auf einem QNAP gehosted. EXT4. Der Zugriff kommt per NFS, aber auch emuliert für Windows als NTFS.
Ich kann per SSH an meine AUfgaben gehen und dann EXT4 nutzen oder über die Freigabe als NFS mounten.
WURZEL-VZ/
WURZEL-VZ/POSTEINGANG
WURZEL-VZ/ARCHIV
WURZEL-VZ/VERTRAEGE
Ich denke, so eine Art "Index" gefällt mir gut.
Bin gespannt, wie ihr das lösen würdet.
Liebe Grüße,
Stefan