如何在 odt 文件中递归搜索短语

如何在 odt 文件中递归搜索短语

我有一个文件夹,里面有子文件夹和许多 libreoffice 文档 (.odt)。

我需要找出哪一个里面有一个特定的短语。

我试过了grep -ir "search phrase here" .,但它只在 xml 文件中找到搜索短语。

有没有办法在非纯文本文件的文档中进行搜索?

答案1

最后我决定使用雷科尔。它在文件中查找信息方面做得很好。但是索引速度很慢,而且占用大量资源。如果您不将 Recoll 作为守护进程运行,而只在不使用计算机时手动更新索引,则这不是问题。

安装它

sudo apt install recoll

截屏

答案2

我对 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"
printf "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 -r 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 来说速度明显较慢。

相关内容