kategorie:

menu:


Vyhledávání lokálních PDF podle obsahu

06.01.2010   ::    topic: Linux

Search local PDFs by content [czech]

Dost často potřebuji rychle najít nějakou informaci z přednáškových slidů, které mám uložené ve formátu PDF. Nepoužívám žádný nástroj na indexaci obsahu počítače (i když poslední dobou experimentuji se Stringi), takže pro mě jedinou možností jak prohledat PDF soubory různě rozházené po složkách bylo otevření Adobe Acrobat Readeru a použít jeho těžkopádný klikací nástroj pro vyhledávání. Asi už jsem zdegenerovaný, ale když chci rychle něco najít, raději bych použil příkaz v konzoli.

Okular (úžasný prohlížeč dokumentů z KDE 4) bohužel funkci na prohledávání více souborů nemá. To mě přivedlo na myšlenku napsat si k tomu nějaké Bashové udělátko. Zde je výsledek:

karry@myKubuntu:/media/data/skola/OBP/Lectures - Vraný$ ls
01_superspective.pdf   02_method_lookup.pdf       07_reflection.pdf
10_object_features.pdf 11_just_in_time_2.pdf      02_MethodDispatch.pdf
06_evolution.pdf       08_garbage_collection.pdf  11_just_in_time.pdf
karry@myKubuntu:/media/data/skola/OBP/Lectures - Vraný$
karry@myKubuntu:/media/data/skola/OBP/Lectures - Vraný$ pdfsearch "inheritance"
search "inheritance" in "/media/data/skola/OBP/Lectures - Vraný/*.pdf"

1       "/media/data/skola/OBP/Lectures - Vraný/07_reflection.pdf"
1       "/media/data/skola/OBP/Lectures - Vraný/10_object_features.pdf"

summary found: 2 in 2 files
karry@myKubuntu:/media/data/skola/OBP/Lectures - Vraný$

Ke správné funkci scriptu je zapotřebí mít v systému nainstalován slocate a poppler-utils (či jinou implementaci pdftotext). Soubor ke stažení je zde… Užijte si to :)

#!/bin/bash

if [ $# -lt 1 ] ; then
    echo "simple cli tool for search PDFs by content"
    echo "this script don\'t work in path constaints symlinks (locate feature)"
    echo "and need builded slocate database (and installed locate of course)"
    echo
    echo "usage:"
    echo "   pdfsearch expression"
    echo "      it search from current directory recursively"
    exit 1;
fi

exp=$1
path=`pwd`"/*.pdf"
echo "search \""$exp"\" in \""$path"\""
echo

files=0
sum=0
IFS=`echo -en "\n\b"` # change internal bash separator

for pdffile in `locate "$path"` ; do

    count=`pdftotext "$pdffile" - | grep -c "$exp"`
    if [ $count -gt 0 ] ; then
        echo -e $count" \t\""$pdffile"\""

        ## uncoment these lines, if you would see searched line
        #pdftotext "$pdffile" - | grep --color=always "$exp"
        #echo

        files=$(( $files + 1 ))
        sum=$(( $sum + $count ))
    fi
done

echo
echo "summary found: "$sum" in "$files" files"