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?



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

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);
} '

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"

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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.