Ferramenta de linha de comando para pesquisar frases em um grande número de arquivos pdf

9

Estou usando o Opensuse 10.3 e gostaria de conhecer ferramentas de linha de comando para pesquisar frases em um grande número de arquivos pdf dentro de um diretório. No Windows XP, a pesquisa do Explorer permite isso, mas é muito lenta. Há dicas grep aqui?

homem do gelo
fonte
wingrep.com ! :)
Apache
Quero conhecer primeiro as ferramentas de linha de comando e, se houver ferramentas da GUI, também será bom. E eu quero pesquisar apenas arquivos pdf, assim que um aplicativo otimizado para isso seria bom ter
iceman
11
Pergunta semelhante no Unix Stack Exchange
Gilles 'SO- stop be evil'

Respostas:

6
SEARCH_DIR = "/ alguns / dir / onde / você / deseja / pesquisar /";
SEARCH_STRING = "o que você estiver pesquisando";
# extrair texto de pdf
pdftotext "file.pdf" "file.txt"

# conectando com grep
pdftotext "arquivo.pdf" / dev / stdout | grep -H --label = "arquivo.pdf" - "$ SEARCH_STRING"

# se você deseja que o grep mostre apenas a lista de arquivos PDF correspondentes, adicione --files-with-correspondências
pdftotext "arquivo.pdf" / dev / stdout | grep -H --label = "arquivo.pdf" - arquivos com correspondências - "$ SEARCH_STRING"

# encontre a lista possível de pdf para pesquisar
encontre "$ SEARCH_DIR" -tipo f -name '* .pdf'> list-of-pdf.txt
# tudo junto com o awk como fita adesiva, enviado para o bash para processamento
# aspas duplas escapam como x22 dentro do awk.
encontre "$ SEARCH_DIR" -tipo f -name '* .pdf' | awk -v SEARCH_STRING = "$ SEARCH_STRING" '{
print "pdftotext \ x22" $ 0 "\ x22 / dev / stdout | grep -H --label = \ x22" $ 0 "\ x22 - \ x22" SEARCH_STRING "\ x22"
} '| bash

# Sem a festança. Processo adicional para atender às suas necessidades
encontre "$ SEARCH_DIR" -tipo f -name '* .pdf' | awk -v SEARCH_STRING = "$ SEARCH_STRING" '
{
EXEC = "pdftotext \ x22" $ 0 "\ x22 / dev / stdout | grep -H --label = \ x22" $ 0 "\ x22 - \ x22" SEARCH_STRING "\ x22";
while (EXEC | getline ret) {
 print "Para o arquivo [" $ 0 "], temos a correspondência [" ret "]";
 # faça o que quiser. 
};
fechar (EXEC);
} '
user42723
fonte
Acho que você não percebeu a parte da pergunta que mencionava “Windows XP” ou a tag de pesquisa do Windows . Eu sei que a pergunta (confusa) começou com o “openSUSE” , mas há mais referências do Windows do que referências do Linux; especialmente quando você conta o comentário subsequente também.
Synetech
@ Synetech: Ele rejeitou uma resposta com "Wingrep is only under Windows", o que sugere que ele quer uma solução Linux.
Caracol mecânico
@Mechanicalsnail, ele a rejeitou porque é uma ferramenta GUI em que solicitou uma ferramenta de linha de comando.
Synetech
3

No Linux e no Windows, você pode usar o Acrobat Reader, que possui um comando para pesquisar vários arquivos.

No Linux, existe o Recoll, que cria um índice dos seus arquivos pdf (e mais) na primeira vez em que você o executa. Após a criação do índice, as pesquisas por palavras devem ser muito rápidas; pesquisas de frases devem ser razoáveis. Verifique se o pdftotextcomando está instalado antes de iniciar o Recoll; no Debian e Ubuntu, está no poppler-utilspacote, não sei sobre o Suse.

Ou você pode converter diretamente os arquivos em texto e usar grep nos arquivos de texto com os comandos abaixo.

encontre -nome '* .pdf' -exec pdftotext {} \;
grep -r --include '* .txt' -l -F "frase exata para pesquisar"
grep -r --include '* .txt' -l -E "expressão regular para pesquisar"
Gilles 'SO- parar de ser mau'
fonte
O Adobe não permitiria pesquisar em um diretório inteiro, mas dentro de um arquivo. Quero saber ferramentas de linha de comando em primeiro lugar e se existem ferramentas GUI, então o seu vai ser bom demais
iceman
O Adobe Reader 9 no Linux possui uma entrada de menu "Editar | Pesquisar", que permite pesquisar em todos os arquivos PDF em um diretório. Na linha de comando, todos os métodos que eu conheço envolvem uma etapa pdftotext(que ferramentas como Recoll farão automaticamente).
Gilles 'SO- stop be evil'
11
+1 para Recoll. A indexação dos arquivos economizará tempo se você tiver muito e pesquisá-los com freqüência.
Caracol mecânico
1

Adobe Reader X faz o trabalho e faz permitir a pesquisa em um diretório inteiro e subdiretórios, não só dentro de um arquivo, mas não é um programa de linha de comando.

stendabrog
fonte
está na versão mais recente do Acrobat X? qual lançamento?
iceman
Tentei a ferramenta de indexação Acrobat e chamá-la de primitiva é um elogio. recollinstalado no debian facilmente, agora tentando torná-lo utilizável para meus funcionários baseados no Windows.
Chris K
0

Para listar recursivamente todos os arquivos no diretório inicial que possuem a extensão de arquivo PDF e que contêm uma linha que corresponde à regex ' [iI]n Haskell', por exemplo, você pode emitir:

find ~/ -regextype posix-extended -regex '.*\.pdf' -execdir sh -c 'pdftotext "$0" - | grep -El --label="$PWD${0#?}" "$1"' {} '[iI]n Haskell' \;

Observações:

  • Embora não seja particularmente necessário para este exemplo, eu criei isso evitando o uso -execou xargsporque, por razões de segurança , acho que é uma boa prática adquirir o hábito de fazê-lo. Alterar ' -execdir' para ' -exec' e ' $PWD${0#?}' para ' $0' deve atingir o mesmo resultado neste caso.
  • Em vez de usar globs para fazer a correspondência de nomes de arquivos com padrões, pode ser útil usar o maior poder expressivo das expressões regulares e fazer a correspondência de padrões em todo o caminho. Incluí a prática aqui para mostrar como isso pode ser feito. Observe que o caminho que corresponde ao padrão é o caminho que normalmente seria impresso. Se é relativo ou absoluto, depende do (s) argumento (s) do caminho fornecido (s), que se emitidos por padrão para o diretório de trabalho atual (' ./'). Neste exemplo, os caminhos comparados são todos absolutos (ou seja, começam com ' /') porque ' ~/' é expandido para o caminho absoluto do diretório inicial do usuário atual e é o único argumento do caminho.
  • Os ' $0' e ' $1' são parâmetros posicionais usados ​​de forma a citar corretamente os argumentos. Se isso não for feito corretamente, o comando estará vulnerável a nomes de arquivos arbitrários.
  • ' ${0#?}' retira o primeiro caractere de $0, ou seja, o ' .'.

Para imprimir cada linha correspondente prosseguida pelo nome do arquivo:

find ~/ -regextype posix-extended -regex '.*\.pdf' -execdir bash -c 'pdftotext "$0" - | grep -EH --label="${0:2}" "$1"' {} '[iI]n Haskell' \;

Essa variante usa ' -H' em vez de ' -l' e rotula com nome de arquivo em vez de caminho de arquivo. ' ${0:2}' retira os dois primeiros caracteres de $0, ou seja, o ' ./', mas aparentemente não é reconhecido por sh.

Obviamente, ajuste suas necessidades.

James Haigh
fonte