Как мне рекурсивно искать фразу в файлах odt

У меня есть папка с подпапками в ней и много документов libreoffice (.odt).

Мне нужно найти, в какой из них есть конкретная фраза.

Я попытался grep -ir "search phrase here" ., но он нашел только поисковую фразу в файле XML.

Есть ли способ поиска в документах, которые не являются текстовыми файлами?

3
задан 20 June 2013 в 11:55

2 ответа

Наконец я решил использовать Recoll. Это делает хорошую работу по поиску информации в файлах. Однако индексация идет медленно и требует много ресурсов. Это не проблема, если вы не запускаете Recoll как демон, а обновляете индекс только вручную, когда не используете компьютер.

0
ответ дан 20 June 2013 в 11:55

У меня аналогичная проблема с файлами OpenDocument (документ ODT, шаблон OTT) и Microsoft Word (документы DOC и DOCX, шаблоны DOT и DOTX).

В настоящее время мне нравится следующий сценарий Bash для рекурсивного поиска:

#!/bin/sh
if [ "$#" -ne 1 ]; then
    echo "Usage: `basename $0` search_pattern"
    echo "You should have installed the following packages: odt2txt, docx2txt and libreoffice-writer"
    exit 1
fi

search_pattern="$1"
echo "Looking for: $search_pattern\n"

find -name '*.odt' -o -name '*.ott' -o \
     -name '*.docx' -o -name '*.dotx' -o \
     -name '*.doc' -o -name '*.dot' \
     -type f | while read doc; do

        doc_fullfilename=$(basename -- "$doc")
        doc_filename="${doc_fullfilename%.*}"
        doc_filetype="${doc_fullfilename##*.}"

        case $doc_filetype in
            'odt' | 'ott')
                (odt2txt "$doc" 2>/dev/null | grep -i "$search_pattern") && echo "^ found in ODT/OTT: $doc" && echo
                ;;
            'docx' | 'dotx')
                (docx2txt "$doc" - 2>/dev/null | grep -i "$search_pattern") && echo "^ found in DOCX/DOTX: $doc" && echo
                ;;
            'doc'| 'dot')
                out_dir=/tmp
                lowriter --headless --convert-to txt:Text "$doc" --outdir "$out_dir" 2>&1 > /dev/null
                grep -i "$search_pattern" "$out_dir/$doc_filename.txt" && echo "^ found in DOC/DOT: $doc" && echo
                ;;
        esac
: ; done

Он показывает результаты поиска и имена файлов.


Примечания:

  1. сценарий использует три внешние программы - odt2txt (для ODT / OTT), docx2txt (для DOCX / DOTX), libreoffice-writer (для DOC / DOT).
  2. теоретически все эти программы можно заменить только одной - LibreOffice Writer, но она значительно медленнее для ODT / OTT и DOCX / DOTX.
1
ответ дан 20 December 2019 в 10:50

Другие вопросы по тегам:

Похожие вопросы: