Dateiname einer Befehlsausgabe als Variable festlegen

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von KillVirus, 13.02.2013.

  1. #1 KillVirus, 13.02.2013
    KillVirus

    KillVirus Grünschnabel

    Dabei seit:
    13.02.2013
    Beiträge:
    3
    Zustimmungen:
    0
    Hallo zusammen,

    ich suche mit

    Code:
    pdfgrep -H -R 1528/12/11 *
    nach einem bestimmten Ausdruck.

    Ausgabe ist z.B.:
    danach sollen weitere Befehle ausgeführt werden. Wie bekomme ich den PDF-Dateinamen als Variable, mit der ich weiterarbeiten kann?

    Falls mehrere Treffer vorhanden sind, werden diese in unterschiedliche Zeilen geschrieben. Kann ich alle als unterschiedliche Variable setzten lassen: also Treffer1, Treffer2..


    -- Hintergrund, falls jemand einen ganz anderen Weg vorschlagen möchte:
    1. Suche nach pdf-Inhalt mit pdfgrep
    2. Anzeige einer bestimmten Zeile der PDF zu jedem Treffer, damit die richtige PDF identifiziert werden kann.
    3. Manuelle Auswahl der "richtigen" PDF-Datei, zB. 3. Treffer.
    4. Verschieben dieser Datei in einen anderen Ordner.

    Im Voraus vielen Dank für jeden Hinweis!
    Marcus
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 derwunner, 13.02.2013
    derwunner

    derwunner Doppel-As

    Dabei seit:
    12.07.2011
    Beiträge:
    118
    Zustimmungen:
    0
    Hallo,
    deine Problemstellung, die du beschreibst, lässt sich höchstwahrscheinlich nicht mehr mit Shell Skripten umsetzen. Konsolen Skripte sind nunmal keine vollwertige Programmiersprache. Und selbst wenn es irgendwie möglich wäre, so performant wäre das nicht. Denn die Standard Linux Programme für Reguläre Ausdrücke drücken stark die Performance deines Skriptes.

    Du könntest es aber z. B. mit Perl oder Java lösen. Bei Java könnte ich dir im groben sagen, wie es geht: Anstatt von pdfgrep verwendest du die iText Bibliothek und filterst aus dem PDF das dahinterstehende HTML und suchst dann mit Pattern.Match nach dem Vorkommen im HTML Teil der PDF-Datei. Damit wäre die Zeilennummer der Vorkommen in etwa korrekt. Also plus/minus 3 Zeilen, je nachdem, wie viel HTML Elemente dein PDF enthält. Kopieren der Datei in einem anderen Ordner geht mit Input- und Outputstreams in Java. Danach kannst du ja die Datei im Quellordner mit Java Mitteln löschen.

    Mit Perl würde ich es so in etwa lösen: pdfgrep ganz normal verwenden und die Rückgabe in eine Variable speichern, die Variable dann auswerten mit split Methoden usw. (damit du nur einmal pro Datei grep/egrep verwenden musst). Danach wie in Java die Dateien mit einem oder mehreren Vorkommen in den Zielordner kopieren und, falls das Kopieren erfolgreich verlief, im Quellordner die Datei löschen.

    In beiden Programmier, bzw- Interpretersprachen wirst du aber nicht um eine Rekursion herumkommen, die im übergebenen Quellordner nach weiteren PDF´s in Unterordnern sucht. Also wirst du wohl auch Perl mit Objektorientierung nutzen müssen ;-)

    Gut geschätzt wird das ein Projekt von einer Woche. Also, viel Spaß!^^


    MFG derwunner
     
  4. #3 Gast123, 13.02.2013
    Gast123

    Gast123 Guest

    Code:
    find ./ -type f -iname "*.pdf" -exec pdfgrep -H -R 1528/12/11 {} \;
    Oder im Skript dann
    Code:
    VAR=`find ./ -type f -iname "*.pdf" -exec pdfgrep -H -R 1528/12/11 {} \;`
     
  5. #4 tgruene, 14.02.2013
    tgruene

    tgruene Routinier

    Dabei seit:
    02.02.2012
    Beiträge:
    418
    Zustimmungen:
    0
    Und alle wuensche zusammen:
     
  6. #5 KillVirus, 14.02.2013
    KillVirus

    KillVirus Grünschnabel

    Dabei seit:
    13.02.2013
    Beiträge:
    3
    Zustimmungen:
    0
    Ihr seid spitze! Vielen Dank für eure Hilfe!
    Gruß Marcus
     
  7. #6 KillVirus, 15.02.2013
    KillVirus

    KillVirus Grünschnabel

    Dabei seit:
    13.02.2013
    Beiträge:
    3
    Zustimmungen:
    0
    Hallo zusammen,

    noch 2 Rückfragen.

    1. pdfgrep gibt als Ergebnis eine Datei auch mehrfach an, wenn der Suchstring dort mehrfach vorkommt. Einen entsprechenden Schalter um dies zu verhindern habe ich nicht gefunden. Geht das mit einfachen Mitteln? Sonst ist das auch keine Problem.

    2. zur Weiterverarbeitung von Dateien

    Code:
    echo "$search"
    ergibt:
    Code:
    pdftotext $search - | grep -a2 Kostenrechnung
    funktioniert.

    Wenn ich aber
    Code:
    1treffer=`echo "$search" | sed -n '1p'`
    pdftotext $1treffer - | grep -a2 Kostenrechnung
    ausführe, erhalte ich:
    Vielen Dank für Hilfe, Gruß Marcus
     
  8. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
Thema:

Dateiname einer Befehlsausgabe als Variable festlegen

Die Seite wird geladen...

Dateiname einer Befehlsausgabe als Variable festlegen - Ähnliche Themen

  1. [FRAGE] Dateinamen normalisieren während sie in einer "for" Schleife sind

    [FRAGE] Dateinamen normalisieren während sie in einer "for" Schleife sind: Moin Gemeinde, ich habe ein Skript welches Emails abholt und weiterverarbeitet, manche müssen ausgedruckt werden. Nun hat sich herausgestellt...
  2. Inhalte in einer Datei suchen und Dateiname ausgeben

    Inhalte in einer Datei suchen und Dateiname ausgeben: Hallo zusammen, ich bin ein ziemlicher Perl Neuling und habe ein Problem das ich mit Perl lösen möchte. Ein Programm schreibt in das...
  3. Einfaches Shellscript - dateinamen ändern

    Einfaches Shellscript - dateinamen ändern: Hey, kann mir jemand vielleicht bei diesem miniscript helfen? ich habe dateien die folgendermaßen aussehen MM-DD-YY-dateiname und...
  4. Wie verschiedene Pattern in diversen Dateinamen finden und ersetzen?

    Wie verschiedene Pattern in diversen Dateinamen finden und ersetzen?: Hi Leute. Ich habe ein kleines Problem. Ich möchte mittels Bash nach bestimmten pattern in Dateinamen suchen und diese durch "nichts"...
  5. Wie finde ich Leerzeichen im dateinamen

    Wie finde ich Leerzeichen im dateinamen: Hallo, ich habe ein script mit einer Schleife über alle Dateien in einem Verzeichnis. #!/bin/sh for i in `ls *` do echo $i...