In deze oefening gaan we gebruik maken van find
om grote PDF-bestanden te vinden, en deze te doorzoeken met behulp van pdftotext
en egrep
.
find
om in de huidige directory alle bestanden te vinden die eindigen op .pdf
find
om enkel de bestanden uit 1 te filteren die groter 100KB zijn. (Check de man-page!)find
om op elk van die bestanden het commando ls -lh
uit te voeren.pdftotext
-commando kan je gebruiken om het bestand dat je meegeeft als argument om te zetten naar platte tekst (in het geval dat de tekst als dusdanig in de PDF ingebed is). Standaard gaat die tekst worden weggeschreven naar een .txt
-bestand, maar je kan er ook voor zorgen dat dit een ander bestand is, door de doelbestandsnaam als tweede argument mee te geven. Indien de doelbestandsnaam -
is (een enkel horizontaal streepje), dan gaat deze echter naar standard output geschreven worden. Gebruik pdftotext
om de tekst van het bestand A.pdf
naar standard output te printen.find
-commando uit stap 3 aan zodat het voor elk van de PDF-bestanden zijn tekst naar standard output stuurt.egrep
, en zoek op alle plaatsen waar de string Bart
(case-sensitive) voorkomt.egrep
heeft weliswaar de optie om bestandsnamen uit te printen, wat standaard aan staat indien je recursief zoekt in meerdere bestanden, maar in dit geval lezen we van een naamloze standard input. Zoek deze optie, en zet deze eens aan om te kijken wat er gebeurt.(standard input)
. Je kan dit label echter customizen met het argument --label
, gebruik dit om een custom label Hallo
voor elke match te zetten.--label
meegegeven wordt. Een probleem: op dit punt filtert egrep
op de uitvoer van het hele find
-commando. Terwijl de link tussen het bestand en de egrep
zijn --label
argument eigenlijk per bestand dat find
vindt zal verschillen. We kunnen ook niet onze gebruikelijke shell-truukjes gebruiken, aangezien egrep
effectief elke keer een ander argument moet meekrijgen. Hoe kunnen we hier nu omheen? Wel, eigenlijk wil je voor elke uitvoering van pdftotext
een aparte pipe opzetten die een aparte egrep
oproep doet. We kunnen dit doen als volgt: in plaats van zomaar pdftotext
op te laten starten door find
, kunnen we elke keer een niet-interactieve bash
laten opstarten (door find
) die custom commando’s (inclusief pipes) uitvoert. We kunnen aan die bash
vragen om pdftotext
te starten met de juiste argumenten, en om die zijn uitvoer door te sturen naar egrep
met de juiste commando’s. Dit kan je doen door bash
op te starten met de -c
optie als volgt: bash -c 'lijst | commandos; meer commandos'
. Gebruik dit om aan per gematchte PDF de pdftotext te filteren met een egrep
die de juiste bestandsnaam gebruikt voor de --label
optie.Let op: de \;
die het einde aangeeft van de -execdir
, mag natuurlijk geen deel uitmaken van dit bash
-commando, maar moet er na komen).
Let op: als je nu met find
ergens een bestandsnaam plakt met {}
die spaties bevat, gaat dit normaal zomaar werken, omdat find
er voor zorgt dat er slechts 1 argument meegegeven wordt op die plaats. Als je echter zo’n bestandsnaam plakt in zo’n geneste bash -c
, weet die bash
natuurlijk niet dat die spaties deel uitmaken van een bestandsnaam. Hoe lost je dit op? (En hou er dan rekening mee.)
(Tip: als je dit ooit in het echt zou willen doen, er bestaat een commando pdfgrep
dat dit, en meer, voor jullie doet. Dit is enkel om te zien hoe je het zelf had kunnen doen, als dit niet bestond, en om je skills te verbeteren :)
.)