LugHanau/hulug_tux.png

Hanau Linux User Group

Suchen und Finden - HowTo

von Joachim

Dieses HowTo soll die verschiedenen Möglichkeiten aufzeigen.

(Zusammengestellt aus unserer Mailling-Liste, Werner)

Inhaltsverzeichnis

  1. Teil 1
  2. Teil 2
  3. Teil 3
  4. Teil 4
  5. Teil 5
  6. Teil 6

1. Teil 1

Hallo,

ich habe mich mit wieder mit diesem Thema beschäftigt. Wieder: weil schon zu den (guten alten) Matrax-Zeiten wir damit zugange waren.

Pascal hat locate genannt und daran kann man zeigen, wie es funktioniert.

Das Programm updatedb erzeugt eine Datenbank der Dateinamen. Welche Verzeichnisse durchsucht werden ist in /etc/updatedb.conf festgelegt. Bzw. dort steht welche nicht durchsucht werden. Mit PRUNEFS wird festgelegt, welche Dateisystemtypen nicht mit in die Suche eingeschlossen werden. Solch eine Datenbank wird auch Index genannt.

Im Folgenden soll es jedoch um Programme gehen, die nicht nur Dateinamen, sondern auch Worte in Datein indizieren.

Historisches: Zu (etwa) Zeiten von suse6.3 war glimpse was ganz tolles. Man konnte eine CD schreiben, die auch einen Index enthielt.

Später habe ich htdig, swish und beagle getestet/benutzt.

In den letzten paar Jahren hat sich die Entwicklung auf Desktop gebundene Indizierer konzentriert. Herr Biel von der LGS hat in seinem Vortrag auf dem diesjaehrigen Hulug Treffen den "semantischen Desktop" gezeigt.

Meine Interessen liegen jedoch anders. Die Dateien liegen auf einen Dateiserver. Es sind fast ausschliesslich nicht veraenderliche Dateien (Archive). Auf die Dateien greife ich von mehreren Rechnern aus zu und es sind viele Dateien.

Würde jeder Benutzer eines Rechners diesen Verzeichnisbaum in sein Desktop-Indizierprogramm aufnahmen, so laege allein hier der Index des Archives mehrfach vor. Dasselbe gilt für weitere Arbeitsstationen. Schlussfolgerung: die Indices sollten bei den Archiven liegen und nur einmal vorhanden sein.

Nachdem in der Zwischenzeit beagle gestorben habe ich jetzt recoll gefunden, was meinen Anforderungen entgegenkommt.

Die Dateien, deren Inhalt indiziert wird, findet man hier:

Dazu bedarf es Hilfsprogramme, wie z.B. unrtf - das aus rtf-Dateien Test extrahiert - die separat zu installieren sind.

Zu bemerken ist auch, dass komprimierte Archive, wie tar.gz, tgz oder zip decomprimiert werden und die darin enthaltenen Dateien indiziert werden.

Joachim

2. Teil 2

Hallo,

recoll kann keine Bilddateien indizieren, das es selbst nicht den Inhalt erkennen kann.

Hier kann man ocr Programme verwenden. Üblicherweise sind bei Linux gocr und tesseract in den Packeten dabei. Da bei meinen Bilddateien tesseract die bessere Erkennungsleistung gezeigt hat, beschreibe ich es hier. Dies muss nicht immer der Fall sein. Da sollte man zumindestens eine kleien Steichprobe machen. Nachteil von tesseract ist, dass es nur tiff Dateien einlesen kann. Hier mein kleines Script um eine Datei nach tiff zu konvertiren und die ocr zu machen.

Datei: /usr/local/bin/tesseract-ocr-deu.sh

fname=$1
fn=${fname%.*}; 
if [[ -e "$fn.txt" ]]; then
        echo "ja1 $fn.txt"; #diese Datei ist schon bearbeitet
else
        if [[ -e "$fn.rtf" ]]; then #diese Datei ist schon bearbeitet
                echo "ja2 $fn.rtf";
        else
                if [[ -f "$fname" ]]; then      #wenn es eine normale Datei ist
                        echo $fname; 
                        convert "$fname" "$fn.tif";  
                        tesseract "$fn.tif" $fn -l deu; 
                        rm -f "$fn.tif"
                fi
        fi
fi
exit

Beispielsweise kann man das folgendermassen aufrufen:

tesseract-ocr-deu.sh test.png

Zuerst wird geprüft, ob eine Datei test.txt oder test.rtf existiert. Wenn ja, wird nichts gemacht. Wenn nein, wird mit convert eine tif Datei erzeugt und mit tesseract bearbeitet. Der Parameter -l deu bedeutet, dass das der Test in deutsch angenommen wird. Von tesseract wird eine Datei test.txt angelegt. Danach wird die tif Datei wieder gelöscht.

Dieses Script ist nicht auf tif Dateien anwendbar, da die tif Datei gelöscht werden würde. Hier habe ich ein Script tesseract-ocr-deu-tif.sh, was identisch ist, nur die Zeilen mit convert und rm fehlen.

Das ist eigentlich nur die Vorbereitung für das Script, welches dafür sorgt, dass alle vorhandenen cpu's des Rechners ausgelastet werden können. Hier hatte ich bei storebackup von Heinz-Josef gesehen, dass er die Komprimierung parallel laufen laesst. Er hat mir sein Script zukommen lassen, welches allerdings etwas umfangreicher ist. Beim stöbern auf dem Internet habe ich dann noch mehrere (bash, perl) Varianten gesehen. Irgendjemand hat sich dann die Muehe gemacht, und das Kommandozeilenprogramm "parallel" prorammiert. Damit sieht dann mein Script so aus:

Datei: /usr/local/bin/parallel-tesseract-deu.sh

cd "$1" #in das Unterverzeichnis wechseln
shopt -s nullglob
parallel -j5 -i tesseract-ocr-deu.sh {} -- *.{png,pnm,jpg,jpeg,PNG,PNM,JPG,JPEG}
parallel -j5 -i tesseract-ocr-deu-tif.sh {} -- *.{tif,tiff,TIF,TIFF}
exit

Aufruf mit: parallel-tesseract-deu.sh <Verzeichnis>

Es wird in das Verzeichnis gewechselt und anschliessend die Bilddateien bearbeitet. Dabei wird parallel mit dem Kommandozeilenparameter -j die Anzahl der parallel zu startenden Prozesse übergeben. Hinter -i kommt der auszuführende Befehl, dem als Parameter eine Bilddatei übergeben wird (Effekt der geschweifte Klammern). Nachteil dieses Vorgehens: Irgendwann sind in dem Verzeichnis weniger als z.B. 5 Dateien zu bearbeiten/vorhanden, so dass zum Schluss immer weniger cpu's ausgelastet werden.

Damit hat man einen Befehl um alle Bilddatein in einem Verzeichnis (parallel bearbeitet) durch die ocr laufen zu lassen. Was jetzt noch fehlt ist ein Script, welches einen Dateibaum durchlaeuft.

Datei: /usr/local/bin/traverse-dirs-parallel-tesseract-deu.sh

process_dir() {
        local -a subdirs=()
        parallel-tesseract-deu.sh $1

        # Suche nach Unterverzeichnissen
        for file in "$1"/*; do
          if [[ -d "$file" ]]; then
            subdirs+=("$file")
          fi
        done

        # Alle Unterverzeichnisse besuchen
        for d in "${subdirs[@]}"; do
                #echo "absteigen" $d;
                if [[ -e $d/kein-ocr.txt ]]; then #wenn diese Datei existiert, nicht absteigen
                        echo "nicht absteigen $dir";
                else
                        process_dir "$d"
                fi
        done
}

if [[ -z "$1" ]]; then
    dir="."     #wenn nichts angegeben, das aktuelle Verzeichnis nehmen
else
    dir="$1"
fi

if [[ -e "kein-ocr.txt" ]]; then
        echo "nicht absteigen $dir";
else
        process_dir "$dir"
fi

exit

Hier habe ich noch eingebaut: Wird eine Datei "kein-ocr.txt" im Verzeichnis gefunden, wird das Verzeichnis und alle Unterverzeichnisse ausgelassen.

Hier ruft sich die Prozedur process_dir rekursiv selber auf, bis alle Unterverzeichnisse besucht worden sind. Für jedes Unterverzeichnis wird das Script zur parallelen Bearbeitung der Bilddateien aufgerufen.

Als Ergebniss hat man für jede Bilddatei eine .txt Datei, die recoll indizieren kann.

Hinweis: Hat man eine pdf-Datei, in der Bilddaten eingebettet wurden, so kann man z.B. mit convert -density 300 <Dateiname>.pdf <Dateiname>.jpg diese in Bilddateien umwandeln.

Was jetzt noch fehlt, ist die parallele Nutzung von cpu's mehrerer Rechner. Das überlasse ich euch zur Uebung.

Gruss, Joachim

3. Teil 3

Hallo zusammen,

den Befehl "parallel" kann man auch beim Digitalisieren verwenden. Einen Scanner mit Einzug vorausgesetzt kann man einen Stoss Papier in einem Rutsch durchlaufen lassen. Hier hat der Kommandozeilenbefehl "scanimage" seine Berechtigung.

Allerdings kann scanimage nur im tif oder pnm Format abspeichern. Danach kann man die erzeugten Dateien parallel ins gewünschte Format wandeln.

Hier also meine kleine Scripte:

Datei: /usr/local/bin/pnm-jpg-50.sh

img="$1";
fn=${img%.*};
echo $fn; 
convert "$fn.pnm" -quality 50 "$fn.jpg";  
rm "$fn.pnm";
exit

Datei: /usr/local/bin/a4.sh

scanimage --device=fujitsu --batch-count=500 --batch-increment=1 --source="ADF duplex" --mode=color --resolution 300 --y-resolution=300  --page-height 300.0 --brightness 0 --contrast 0 -l 5.0 -t 0.0 -x 205.0 -y 280.0 --batch-start=$2 --batch=$1_%.3d.pnm
shopt -s nullglob
parallel -j3 -i pnm-jpg-50.sh {} -- *.pnm
exit

Aufruf des Scriptes mit:

a4.sh <Dateiname> <Zahl>

Beispiel: a4.sh test 1 erzeugt Dateien mit Namen: test_001.pnm test_002.pnm etc.

Hat es einen Papierstau gegeben, kann man mit der nächsten Nummer fortsetzen:z.B. a4.sh test 14

Einige der Parameter oben sind nur für meinen Scanner von Bedeutung. Mit scanimage -L werden die erkannten Scanner angezeigt und scanimage -h zeigt nicht nur die allgemeinen Parameter von scanimage, sondern auch spezielle Parameter, die sich auf die angeschlossenen Scanner beziehen.

Gruss, Joachim

4. Teil 4

Hallo,

sie sind mir zuvorgekommen: http://www.heise.de/open/artikel/Toolbox-Desktop-Suche-mit-Recoll-1715658.html Den Inhalt sollte Teil 4 und 5 werden.

Gruss Joachim

5. Teil 5

Hier noch der Verweis auf einen Artikel: http://www.linux-community.de/Internal/Artikel/Print-Artikel/LinuxUser/2012/01/Desktopsuche-der-feinen-Art-Recoll-1.16

Joachim

6. Teil 6

Hallo,

hier folgt, wie man mit recoll in mehreren Indices sucht.

Recoll verlangt beim Start, dass ein Index angegeben wird. Da dieser Index immer durchsucht wird, muss man hier zu einem kleinen Kniff greifen: man wählt einen (fast) leeren Index. Dann kann man nach Bedarf die weiteren Indices hinzunehmen.

Rezept: 1. man erstelle Verzeichnisse

und Erzeuge in /.../irgendwo/leer eine Datei z.B. test.txt leer oder mit irgendeinem Inhalt.

2. nach /.../irgendwo kopiere man die Konfigurationsdatei aus /usr/share/recall/examples/recoll.conf.

3. Dann ändere man in /.../irgendwo/recoll.conf die Zeile mit dem Eintrag des Pfades, der indiziert werden soll: topdirs = /.../irgendwo/leer und die Zeile, wo der Index hinkommt: dbdir = /.../irgendwo/xapiandb

4. Die Einstellungen der Sprachen kommt nach: indexstemminglanguages = german english

5. Auf der Kommandozeile navigiere man zu /.../irgendwo und führe aus: recallindex -c . Das geht sehr schnell, da nur die evtl. vorhandene Datei test.txt indiziert wird.

6. Um zu suchen führe man aus: recoll -c . Der Parameter -c bestimmt, welche Konfigurationsdatei verwendet werden soll. In diesem Fall ist es die im aktuellen Verzeichnis. Es startet die grafische Suche. Hier kann man zur Probe ein Begriff, der in der Datei test.txt steht, eingeben und auf "Suchen" klicken. Es sollte dieser Eintrag erscheinen.

Ende des Rezeptes.

Hat man nun weitere Dateien zu indizieren, so kann man die Schritte 1 bis 5 dafür durchführen.

Hat man das mehrfach durchgeführt, so dass jetzt Indices für z.B. Mechanik, Elektronik, Chemie und Computer existieren, so geht man auf das Verzeichnis mit dem fast leeren Index zurück: cd /.../irgendwo und startet die Oberfläche mit "recoll -c .". Dann kann man unter dem Menuepunkt "Voreinstellungen/Dialog für externe Indizierungen" "Index hinzufügen" wählen und die Indices für z.B. Mechanik, Elektronik, Chemie und Computer hinzufügen. Wenn man dann noch den entsprechenden Index mit einem Häkchen aktiviert, so wird auch dort gesucht.

Auf diese Weise kann man beliebige Konfigurationen von zu durchsuchende Inducies haben.

Weiterer kleiner Hinweis: Die Symbole in den Suchergebnisse auf der linken Seite haben ein Kontextmenue (Klick rechte Maustaste). Hier finden man insbesondere den Befehl: "Open parent document/folder".

Gruss, Joachim

LugHanau/HowTos/SuchenUndFinden (zuletzt geändert am 2012-09-28 13:34:20 durch WernerMuehl)