2017-07-11 4 views
1

Ich möchte ein Skript schreiben, das einen Befehl zu OCR pdfs ausführt, die die resultierenden Bilder löscht, nachdem die Textdateien geschrieben wurden.Kombinieren Sie zwei Befehle mit GNU parallel für OCR-Projekt

Die zwei Befehle, die ich kombinieren möchte, sind die folgenden.

Dieser Befehl Ordner erstellen, extrahieren pgm von jedem PDF und fügt sie in jedem Ordner:

time find . -name \*.pdf | parallel -j 4 --progress 'mkdir -p {.} && gs -dQUIET -dINTERPOLATE -dSAFER -dBATCH -dNOPAUSE -dPDFSETTINGS=/screen -dNumRenderingThreads=4 -sDEVICE=pgmraw -r300 -dTextAlphaBits=4 -sProcessColorModel=DeviceGray -sColorConversionStrategy=Gray -dOverrideICC -o {.}/{.}-%03d.pgm {}' 

Dieser Befehl funktioniert die OCR und löscht die resultierenden Bilder (pgm):

time find . -name \*.pgm | parallel -j 4 --progress 'tesseract {} {.} -l deu_frak && rm {.}.pgm' 

I möchte beide Befehle kombinieren, so dass das Skript die pgm Bilder nach jeder OCR löscht. Wenn ich die obigen Befehle ausführe, extrahiert der erste Bilder und wird meinen Speicherplatz auffressen, dann würde der zweite Befehl die OCR machen und erst danach die Bilder als letzten Schritt löschen.

So

  1. Ordner erstellen
  2. Extract PGM von PDF
  3. OCR von PGM txt
  4. PGM Bilder löschen, die gerade verwendet wurden (fehlende)

Grundsätzlich möchte ich diese 4 Schritte in dieser Reihenfolge für jeden PDF getrennt durchführen und nicht für alle PDF an on ce. Wie kann ich das machen?

Edit:

Mein erster Versuch, meine Probleme zu lösen war, den folgenden Befehl aus:

time find . -name \*.pdf | parallel -j 4 -m --progress --eta 'mkdir -p {.} && gs -dQUIET -dINTERPOLATE -dSAFER -dBATCH -dNOPAUSE -dPDFSETTINGS=/screen -dNumRenderingThreads=4 -sDEVICE=pgmraw -r300 -dTextAlphaBits=4 -sProcessColorModel=DeviceGray -sColorConversionStrategy=Gray -dOverrideICC -o {.}/{.}-%03d.pgm {}' && time find . -name \*.pgm | parallel -j 4 --progress --eta 'tesseract {} {.} -l deu_frak && rm {.}.pgm' 

jedoch Tesserakts das Sprachpaket nicht finden würde.

Antwort

2

aktualisiert Antwort

Ich habe dies bitte auf einem Kopie einer kleinen Teilmenge der Dateien führen Sie es nicht getestet. Sie können die Nachrichten mit DEBUG: beim Start deaktivieren, wenn Sie glücklich sind, sieht es gut aus:

#!/bin/bash 

# Declare a function for "parallel" to call 
doit() { 
    # Get name of PDF with and without extension 
    withext="$1" 
    noext="$2" 
    echo "DEBUG: Processing $withext into $noext" 

    # Make output directory 
    mkdir -p "$noext" 

    # Extract as PGM into subdirectory 
    gs ... -o "$noext"/"${noext}-%03d.pgm $withext" 

    # Go to target directory or die with error message 
    cd "$noext" || { echo ERROR: Failed to cd to $noext ; exit 1; } 

    # OCR and remove each PGM 
    n=0 
    for f in *pgm; do 
     echo "DEBUG: OCR $f into $n" 
     tesseract "$f" "$n" -l deu_frak 
     echo "DEBUG: Remove $f" 
     rm "$f" 
     ((n=n+1)) 
    done 
} 

# Ensure the function is exported to subshells 
export -f doit 

find . -name \*.pdf -print0 | parallel -0 doit {} {.} 

Sie sollten die doit() Funktion ohne parallel, indem Sie testen können:

doit someFile.pdf someFile 

Original-Antwort

Wenn Sie viele Dinge für jedes Argument in GNU Parallel tun möchten, die einfachste Weg ist, eine bash Funktion zu deklarieren und dann das zu nennen.

Es sieht wie folgt aus:

# Declare a function for "parallel" to call 
doit() { 
    echo "$1" "$2" 
    # mkdir something 
    # extract PGM 
    # do OCR 
    # delete PGM 
} 

# Ensure the function is exported to subshells 
export -f doit 

find some files -print0 | parallel -0 doit {} {.} 
+2

Bitte geben Sie $ 1 und $ 2 - sonst Ihre Benutzung -print0 nicht wirklich einen Unterschied machen: 'echo "$ 1" "$ 2"'. –

+1

Zusätzlicher Bonus durch Verwendung einer Funktion: Es ist sehr einfach, eine einzelne Datei zu testen. –

+0

Hallo Mark Setchell, danke für die Lösung. Es sieht gut aus! Leider kann ich es nicht funktionieren, indem ich einfach 'n' kopiere, um meine Befehle in das Skript einzufügen. Beachte, dass ich in solchen Dingen Anfänger bin. Wären Sie so freundlich, mit meinen Befehlen eine praktikable Lösung zu erstellen? Das wäre fantastisch! Stellen Sie sich vor, Sie hätten die "PDF" in einem Ordner namens "test". Wie würdest du mit dem Skript fortfahren? –