我在寻找:
- 一种在 odt 文件内部进行搜索的方法(即搜索内容,而不是名称)
- 不需要任何类型的索引
- 它是图形化的,非常用户友好(对于不太喜欢电脑的老年人来说)
我知道 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)中打开它。您可以对多个文件执行此操作:
点击“确定”、“取消”或关闭窗口后,脚本将退出。
有一些基本检查可以指导用户,并在出现问题时警告他们:
希望这符合要求☺。