Dateiname einer Befehlsausgabe als Variable festlegen

K

KillVirus

Grünschnabel
Hallo zusammen,

ich suche mit

Code:
pdfgrep -H -R 1528/12/11 *

nach einem bestimmten Ausdruck.

Ausgabe ist z.B.:
305448.pdf:Mein Zeichen: 1528/12/11

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
 
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
 
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 {} \;`
 
Ihr seid spitze! Vielen Dank für eure Hilfe!
Gruß Marcus
 
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:
./BuchhaltungShell.sh: line 57: 1treffer=.//305448.pdf: No such file or directory
I/O Error: Couldn't open file 'treffer'

Vielen Dank für Hilfe, Gruß Marcus
 

Ähnliche Themen

Keine grafische Oberfläche (Debian Installation)

Variablen bzw. Strings aus Logfiles lesen

pdf auslesen und ausgeben

For Schleife in eine Variable(String) einlesen

Server-Monitoring mit RRDTool

Zurück
Oben