Поиск файлов ODT без индексации

Я ищу:

  1. способ поиска в файлах odt (т. Е. Поиск содержимого, а не имени)
  2. , который не требует какой-либо индексации
  3. , который является графическим и очень удобным (для относительно пожилого человека, который не любит компьютеры)

Я знаю, что возможно иметь 1) и 2):

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

работает достаточно хорошо и довольно быстро. Но мне интересно, есть ли уже хорошее решение, которое делает это с графическим интерфейсом (или может быть адаптировано для этого легко)

3
задан 11 June 2014 в 01:00

1 ответ

Решение с помощью yad сценария

<час>

Обзор

, К сожалению, нет никакой существующей опции GUI, которая смогла бы перерыть документы LibreOffice, не создавая индекс сначала (например, Recoll, Средство отслеживания). Самый близкий, который я нашел, был 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 использует 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

Установка

Копия и вставка содержание поля кода выше в новый текстовый файл, назовите его вообще, Вы хотите и делаете это исполняемым файлом. Можно интегрировать сценарий с системой различными способами, например, путем присвоения средство запуска или использования его в качестве сценарий .

Наутилуса Использование

, В первый раз запустив сценарий, Вас встретят диалоговым окном записи для папки, которую Вы хотите перерыть и критерий поиска:

enter image description here

Нажимают на 'OK' для запуска запроса. Это могло бы требовать времени:

enter image description here

, Когда окно результата открывается, можно дважды щелкнуть по любой из записей для открытия его в средстве просмотра по умолчанию (LibreOffice, обычно). Можно сделать это больше чем для одного файла:

enter image description here

сценарий выйдет после удара хорошо, Отмены или закрытия окна.

существуют некоторые основные проверки, чтобы направить пользователя и предупредить их, если что-то пошло не так, как надо:

enter image description here

enter image description here

, Надо надеяться, это отвечает всем требованиям ☺.

4
ответ дан 11 June 2014 в 01:00

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

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