Procura por arquivos odt sem indexação

3

Estou procurando:

  1. uma maneira de pesquisar dentro de arquivos odt (ou seja, pesquisar conteúdo, não nome)
  2. que não requer nenhum tipo de indexação
  3. que é gráfica e muito amigável (para uma pessoa relativamente velha, que não gosta muito de computadores)

Eu sei que é possível ter 1) e 2):

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

funciona bem o suficiente e é bem rápido. Mas eu me pergunto se já existe uma boa solução que faz isso com uma GUI (ou pode ser adaptada para fazer isso facilmente)

    
por josinalvo 10.06.2014 / 18:38

1 resposta

4

Solução usando um script yad

Visão geral

Infelizmente, não existe uma opção de GUI existente que possa pesquisar nos documentos do LibreOffice sem primeiro criar um índice (por exemplo, Recoll, Tracker). O mais próximo que eu encontrei foi gnome-search-tool mas ele só suporta arquivos de texto simples.

Como eu estava procurando pelo mesmo tipo de funcionalidade há alguns meses, decidi sentar e ver o que poderia fazer comigo mesmo. Então, sem mais delongas, aqui está o roteiro que escrevi:

Localizador de 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="" \
      --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 ""
}

# 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

Dependências

O localizador de ODT utiliza unoconv para converter documentos LO em texto simples. A GUI é baseada em yad, um poderoso fork do Zenity. O Yad ainda não está disponível nos repositórios oficiais, mas você pode instalá-lo a partir de um PPA webupd8.

Os seguintes comandos devem cuidar de todas as dependências:

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

Instalação

Copie e cole o conteúdo da caixa de código acima em um novo arquivo de texto, nomeie-o como quiser e torne-o executável. Você pode integrar o script ao seu sistema de várias maneiras, por exemplo atribuindo um lançador ou usando-o como um Script do Nautilus .

Uso

Pela primeira vez, ao iniciar o script, você será recebido com uma caixa de diálogo de entrada para a pasta pela qual deseja pesquisar e o termo de pesquisa:

Clique em 'OK' para iniciar a consulta. Isso pode demorar um pouco:

Quando a janela de resultados aparecer, você pode clicar duas vezes em qualquer uma das entradas para abri-la em seu visualizador padrão (LibreOffice, geralmente). Você pode fazer isso por mais de um arquivo:

O script sairá depois de clicar em OK, Cancelar ou fechar a janela.

Existem algumas verificações básicas para orientar o usuário e avisá-lo se algo deu errado:

Espero que isso se encaixe no projeto <.

    
por Glutanimate 10.06.2014 / 22:59