Como converter todos os arquivos pdf em texto (dentro de uma pasta) com um comando?

18

Eu sei que posso converter arquivos PDF em arquivos de texto um por um como este:

$ pdftotext filename.pdf

Mas existe um único comando que faria essa conversão sem especificar nomes de arquivos separados para converter todos eles?

Vejo aqui, na Wikipedia , que "caracteres curinga (*), por exemplo, $ pdftotext * pdf, para converter vários arquivos, não podem ser usados ​​porque o pdftotext espera apenas um nome de arquivo".


fonte

Respostas:

23

A seguir, todos os arquivos serão convertidos no diretório atual:

for file in *.pdf; do pdftotext "$file" "$file.txt"; done
Sam
fonte
seu apenas um comando, ele pode ser digitado em uma linha no terminal (seu o pdftotext dentro de um loop for em um de uma linha-sintaxe, que é o que a op pediu)
Sam
confira estes links para obter mais informações de como o loop for funciona: cyberciti.biz/faq/bash-for-loop thegeekstuff.com/2011/07/bash-for-loop-examples
Sam
isso não causaria problemas com arquivos não PDF?
Cspitt
Isso não produziria arquivos como "filename.pdf.txt"?
Ryan C. Thompson
sim, se isso for um problema, poderíamos remover a extensão .pdf usando 'sed' ou 'awk', mas isso acrescentaria complexidade ao comando
Sam
8
ls *.pdf | xargs -n1 pdftotext

xargsgeralmente é uma solução rápida para executar o mesmo comando várias vezes, com apenas uma pequena alteração a cada vez. A -n1opção garante que apenas um arquivo pdf seja passado para o pdftotext por vez.

Edit: Se você está preocupado com espaços em nomes de arquivos e outros, você pode usar esta alternativa:

find . -name '*.pdf' -print0 | xargs -0 -n1 pdftotext
Ryan C. Thompson
fonte
veja minha resposta: esse comando pode ser adaptado para evitar o problema mencionado lá? isso não significa que sua solução não é boa; pelo contrário, faz algo muito específico que as outras alternativas aqui não. mas eu estava apenas curioso
2
Como alternativa:ls *.pdf | xargs -L1 -I% pdftotext % %.txt
kenorb
2

escreva um script bash

for f in *.pdf; do
  pdftotext "$f"
done

ou digite-o em um comando de uma linha da seguinte maneira:

for f in *.pdf; do pdftotext "$f"; done

Eu espero que isso ajude. Não tenho um grande grupo de .pdfs para testar isso, mas uso essa estratégia para converter meus arquivos .flac em arquivos .ogg.

cprofitt
fonte
isso pode ser feito abrindo o terminal nessa pasta e executando um comando em vez de inserir o caminho manualmente?
você não pode colá-lo aqui como tal e inseri-lo na sua resposta? isso seria uma boa resposta. i não foi capaz de chegar à fórmula bom apenas por exclusão de uma parte do que você postou
o find e os xargs que sugeri inicialmente não funcionaram quando tive a chance de testá-los.
precisa saber é
1

Devo agradecer primeiro a Sam e Ryan Thompson , bem como a todos os outros respondentes - pois minha resposta aqui não passa de uma variação relacionada à possibilidade de adicionar suas soluções às ações personalizadas de Thunar:

portanto, como qualquer comando do terminal, um comando para converter em texto todos os arquivos pdf em uma pasta pode ser colocado na lista de ações personalizadas no gerenciador de arquivos Thunar

insira a descrição da imagem aqui

insira a descrição da imagem aqui

insira a descrição da imagem aqui

O comando que existe find . -name '*.pdf' -print0 | xargs -0 -n1 pdftotext(vindo de Ryan Thompson ) é o que eu prefiro usar, mas tem uma virada desagradável ... veja abaixo ...

insira a descrição da imagem aqui

insira a descrição da imagem aqui

... é um comando engraçado, que deve ser usado com cuidado: é feito para converter em texto todo o pdf na pasta em que é disparado, portanto, se for disparado por engano na pasta inicial, haverá alguns indesejados efeitos: todos os seus PDFs serão convertidos em texto!

(Eu testei assim: criei uma pasta chamada "test" na área de trabalho e nela um arquivo pdf e uma série de pastas dentro de pastas ( /Desktop/test/a/b/c/e/f/g/h/i) cada uma contendo o mesmo pdf. A execução desse comando /Desktop/testconverte todos os pdfs em pasta "i".)

(Gostaria de receber comentários sobre como ajustar esse comando para evitar esse risco.)

Substituindo isso pelo outro ( for file in *.pdf; do pdftotext "$file" "$file.txt"; done) vindo de Sam , o problema é evitado.

Mas, em certos casos, pode-se desejar exatamente o que a solução de Ryan faz!

Comunidade
fonte
11
Você pode evitar que o findcomando procure nos subdiretórios usando -maxdepth 1. Além disso, ao colocá-lo no recurso de ações personalizadas do Thunar, você provavelmente deve substituir find .por find %Fpara permitir que o Thunar passe corretamente os caminhos dos diretórios selecionados.
Ryan C. Thompson
0
for file in *.pdf; do pdftotext "$file" "$file.txt"; done

Este gera sample.pdf.txt .

Tentei usar este, como sugerido pelo usuário2357111317 e também incluo -layout para preservar o layout do texto

for file in *.pdf; do pdftotext -layout "$file"; done
hinky
fonte