Jede Datei nur einmal bearbeiten (make?)

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Hobbystern
Beiträge: 15
Registriert: 10.06.2009 08:39:03

Jede Datei nur einmal bearbeiten (make?)

Beitrag von Hobbystern » 09.03.2017 20:55:41

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?

Benutzeravatar
Meillo
Moderator
Beiträge: 9231
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Jede Datei nur einmal bearbeiten (make?)

Beitrag von Meillo » 09.03.2017 22:06:10

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:

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!

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Jede Datei nur einmal bearbeiten (make?)

Beitrag von heisenberg » 10.03.2017 15:03:32

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.

Benutzeravatar
smutbert
Beiträge: 8342
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Jede Datei nur einmal bearbeiten (make?)

Beitrag von smutbert » 10.03.2017 15:11:39

ich musste bei der Fragestellung an beagle denken (beagle war eine Desktopsuche und sozusagen der Vorgänger von Debiantracker). 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 Debianattr 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.

Hobbystern
Beiträge: 15
Registriert: 10.06.2009 08:39:03

Re: Jede Datei nur einmal bearbeiten (make?)

Beitrag von Hobbystern » 14.03.2017 13:21:53

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

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
Skript 2

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
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

Antworten