Как преобразовать все файлы PDF в текст (в папке) с помощью одной команды?

18

Я знаю, что я могу конвертировать PDF-файлы в текстовые файлы один за другим, как это:

$ pdftotext filename.pdf

Но есть ли одна команда, которая могла бы выполнить это преобразование без указания отдельных имен файлов, чтобы преобразовать их все?

Здесь, в Википедии , я вижу , что «Символы подстановки (*), например $ pdftotext * pdf, для преобразования нескольких файлов не могут использоваться, потому что pdftotext ожидает только одно имя файла».


источник

Ответы:

23

Следующее преобразует все файлы в текущем каталоге:

for file in *.pdf; do pdftotext "$file" "$file.txt"; done
Сэм
источник
его единственная команда, она может быть введена в одну строку в терминале (это pdftotext внутри цикла for в однострочном синтаксисе, что и требовалось в операторе)
Сэм
проверьте эти ссылки для получения дополнительной информации о том, как работает цикл for: cyberciti.biz/faq/bash-for-loop thegeekstuff.com/2011/07/bash-for-loop-examples
Сэм
это не вызвало бы проблемы с файлами не в формате PDF?
cprofitt
Не приведет ли это к созданию файлов типа «filename.pdf.txt»?
Райан К. Томпсон
да, если это проблема, мы могли бы удалить расширение .pdf, используя «sed» или «awk», но это добавило бы сложности команде
Sam
8
ls *.pdf | xargs -n1 pdftotext

xargsчасто является быстрым решением для запуска одной и той же команды несколько раз с небольшим изменением каждый раз. -n1Вариант гарантирует , что только один PDF файл передается pdftotext одновременно.

Изменить: Если вы беспокоитесь о пробелах в именах файлов и тому подобное, вы можете использовать эту альтернативу:

find . -name '*.pdf' -print0 | xargs -0 -n1 pdftotext
Райан К. Томпсон
источник
пожалуйста, посмотрите мой ответ: можно ли адаптировать эту команду, чтобы избежать упомянутой проблемы? это не означает, что ваше решение не является хорошим, напротив, оно делает что-то очень конкретное, чего нет в других альтернативах. но мне было просто любопытно
2
В качестве альтернативы:ls *.pdf | xargs -L1 -I% pdftotext % %.txt
kenorb
2

написать скрипт bash

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

или введите его в однострочную команду следующим образом:

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

Надеюсь, это поможет. У меня нет большой группы .pdf для тестирования, но я использую эту стратегию для преобразования моих файлов .flac в файлы .ogg.

cprofitt
источник
это можно сделать, открыв терминал в этой папке и выполнив команду вместо ручного ввода пути?
не могли бы вы вставить это здесь и вставить в свой ответ? это был бы хороший ответ. я не смог достичь хорошей формулы, просто удалив часть того, что вы опубликовали
находка и xargs, которые я первоначально предложил, не работали, когда у меня была возможность проверить их.
cprofitt
1

Я должен сначала поблагодарить Сэма и Райана Томпсона, а также всех остальных ответчиков - поскольку мой ответ здесь - не что иное, как вариант, касающийся возможности добавления их решений в пользовательские действия Тунара:

поэтому, как и любая терминальная команда, команда для преобразования в текст всех PDF-файлов в папке может быть помещена в список пользовательских действий в файловом менеджере Thunar.

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

Команда, которая есть find . -name '*.pdf' -print0 | xargs -0 -n1 pdftotext, (пришедшая от Райана Томпсона ) - это та, которую я предпочитаю использовать, но она имеет неприятный ход ... см. Ниже ...

введите описание изображения здесь

введите описание изображения здесь

... это забавная команда, которую нужно использовать с осторожностью: она сделана для преобразования в текст всех PDF-файлов внутри папки, в которой она запущена, поэтому, если она будет запущена по ошибке в домашней папке, она будет иметь некоторые нежелательные эффекты: все ваши PDF-файлы будут преобразованы в текст!

(Я проверил это следующим образом: создал папку с именем «test» на рабочем столе и в ней pdf-файл и ряд папок в папках ( /Desktop/test/a/b/c/e/f/g/h/i), каждая из которых содержит один и тот же pdf. Запуск этой команды в /Desktop/testпреобразует все pdfs в файл в папка "я")

(Я хотел бы получить комментарии о том, как настроить эту команду, чтобы избежать этого риска.)

Заменив это на другой ( for file in *.pdf; do pdftotext "$file" "$file.txt"; done), исходящий от Сэма , проблема устранена.

Но в некоторых случаях можно пожелать именно то, что делает решение Райана!

Сообщество
источник
1
Вы можете избежать findпоиска команд в подкаталогах, используя -maxdepth 1. Кроме того , при вводе его в функции пользовательских действий Thunar, вы , вероятно , следует заменить find .с , find %Fчтобы позволить Thunar правильно пройти путь выбранных каталогов.
Райан Томпсон
0
for file in *.pdf; do pdftotext "$file" "$file.txt"; done

Этот выводит sample.pdf.txt .

Я попытался использовать это, как предлагает user2357111317, и я также включаю -layout, чтобы сохранить макет текста

for file in *.pdf; do pdftotext -layout "$file"; done
hinky
источник