无需索引即可搜索 odt 文件

无需索引即可搜索 odt 文件

我在寻找:

  1. 一种在 odt 文件内部进行搜索的方法(即搜索内容,而不是名称)
  2. 不需要任何类型的索引
  3. 它是图形化的,非常用户友好(对于不太喜欢电脑的老年人来说)

我知道 1) 和 2) 是可能的:

for x in `find . -iname '*odt'`; do odt2txt $x | grep Query; done

运行良好,而且速度很快。但我想知道是否已经有一个很好的解决方案可以用 GUI 来实现这一点(或者可以轻松实现这一点)

答案1

使用 yad 脚本的解决方案


概述

不幸的是,没有现有的 GUI 选项可以在不先创建索引的情况下搜索 LibreOffice 文档(例如 Recoll、Tracker)。我找到的最接近的选项是gnome-search-tool但它只支持纯文本文件。

因为几个月前我一直在寻找相同类型的功能,所以我决定坐下来看看自己能想出什么。所以,事不宜迟,下面是我写的脚本:

ODT 查找器

#!/bin/bash

# NAME:           ODT finder
# AUTHOR:         (c) 2014 Glutanimate (https://github.com/Glutanimate)
# LICENSE:        GNU GPLv3 (http://www.gnu.de/documents/gpl-3.0.en.html)
# DEPENDENCIES    yad libreoffice unoconv


# Dialogs

Title="ODT finder"
TxtEntry="Please enter the <b>directory</b> you would like to search through \
and the <b>search term.</b>"
ErrNoArgs="ERROR: Please make sure to supply both a search path and search term"
ErrNoReslt="No results found."

# Variables

declare -A Results

# Functions

dialog_options(){
    SearchOptions="$(yad --form --title="$Title" --text="$TxtEntry" \
    --width=400 --height=200 --center \
    --field="Directory":DIR \
    --field="Search term" )"

    RET="$?"

    if [[ "$RET" != "0" ]]; then
      echo "Aborting"
      exit 1
    fi   
    
    SearchPath="$(echo "$SearchOptions" | cut -d '|' -f1)"
    SearchTerm="$(echo "$SearchOptions" | cut -d '|' -f2)"
    
    echo "Path: $SearchPath"
    echo "Query: $SearchTerm"
    
    if [[ -z "$SearchPath" || -z "$SearchTerm" ]]; then
      dialog_error "$ErrNoArgs"
      dialog_options
    fi
}


odt_search(){
    while IFS= read -r -d '' File; do
        Match="$(unoconv --format txt --stdout "$File" 2> /dev/null  | grep -m "1" -i "$SearchTerm")"
        if [[ -n "$Match" ]]
          then
              echo "Match found for $File:"
              echo "$Match"
              Results["$File"]="$Match"
          else
              echo "No Result found in $File"
        fi
    done < <(find "$SearchPath" -type f -name '*.odt' -print0)
    echo "1" > "$SearchState"
}

dialog_error(){
    yad --title="$Title" \
      --center --width="400" --height="100" \
      --image=dialog-error \
      --window-icon=dialog-error \
      --class="$WMCLASS" \
      --text="$1" \
      --button="OK":0 2> /dev/null
}



dialog_progress(){
    sleep 0.5
    while true; do
      if [[ "$(cat "$SearchState")" = "1" ]]; then
        break
      else
        echo "#Searching..."
        sleep 0.5
      fi
    done | \
    yad --progress --pulsate --auto-close \
    --width=350 --height=100 \
    --title="$Title" \
    --text="Searching for '<b>$SearchTerm</b>' in '<b>$SearchPath</b>' ..." \
    --button='_Cancel!gtk-cancel!':1 \
    2> /dev/null
    PROG_RET="$?"
    if [[ "$PROG_RET" != "0" ]]
      then
          kill -s TERM "$TOP_PID"
    fi
}

dialog_results(){
    TxtMain="Search results for '<b>$SearchTerm</b>' in '<b>$SearchPath</b>'"

    if [[ -z "${Results[@]}" ]]; then
      dialog_error "$ErrNoReslt"
      exit 1
    fi

    for File in "${!Results[@]}"; do
      echo "$File"
      echo "Ubuntu Mono 12"
      echo "\"[...]${Results[$File]}[...]\""
    done | \
    yad --list --listen --print-column=1 \
    --expand−column=0 \
    --title="$Title" \
    --text="$TxtMain" \
    --ellipsize=NONE \
    --width=800 --height=600 --center \
    --dclick-action="bash -c \"open_result %s\" &" \
    --column="File":TEXT --column=@font@ --column="Result":TEXT
}

open_result(){
    xdg-open "$1"
}

# Prep

TOP_PID="$$"

SearchState="$(mktemp -u --tmpdir "${0##*/}.XXXXX")"
echo "0" > "$SearchState"

export -f open_result

# Cleanup

trap "echo "1" > "$SearchState"; sleep 1; [[ -f "$SearchState" ]] && rm -r "$SearchState"; exit" EXIT

# Main

dialog_options
dialog_progress&
odt_search
dialog_results

依赖项

ODT finder 使用 unoconv 将 LO 文档转换为纯文本。GUI 基于 yad,一个功能强大的 Zenity 分支。Yad 尚未在官方存储库中提供,但您可以从 webupd8 PPA 安装它。

以下命令应处理所有依赖关系:

sudo add-apt-repository ppa:webupd8team/y-ppa-manager
sudo apt-get update
sudo apt-get install unoconv yad

安装

将上面的代码框的内容复制并粘贴到新的文本文件中,随意命名并使其可执行。您可以通过多种方式将脚本与您的系统集成,例如通过分配启动器或者使用它作为Nautilus 脚本

用法

首次启动脚本时,您将看到一个输入对话框,其中包含要搜索的文件夹和搜索词:

在此处输入图片描述

单击“确定”开始查询。这可能需要一段时间:

在此处输入图片描述

当结果窗口弹出时,您可以双击任何条目以在默认查看器(通常是 LibreOffice)中打开它。您可以对多个文件执行此操作:

在此处输入图片描述

点击“确定”、“取消”或关闭窗口后,脚本将退出。

有一些基本检查可以指导用户,并在出现问题时警告他们:

在此处输入图片描述

在此处输入图片描述

希望这符合要求☺。

相关内容