Як конвертувати всі файли PDF у текст (у папці) за допомогою однієї команди?


18

Я знаю, що я можу конвертувати PDF-файли в текстові файли по одному так:

$ pdftotext filename.pdf

Але чи є одна команда, яка зробила б це перетворення без зазначення окремих імен файлів, щоб перетворити їх усіх?

Я бачу тут, у Вікіпедії , що "Wildcards (*), наприклад $ pdftotext * pdf, для перетворення декількох файлів, не можна використовувати, оскільки pdftotext очікує лише одного імені файлу."

pdf  text  convert  batch 

Відповіді:


23

Далі перетворяться всі файли в поточному каталозі:

for file in *.pdf; do pdftotext "$file" "$file.txt"; done

єдина його команда, вона може бути введена в одному рядку в терміналі (її pdftotext всередині циклу for циклу в однорядковому синтаксисі, про що запитував op)
Сем

перевірити ці посилання для отримання додаткової інформації про те , як цикл робіт: cyberciti.biz/faq/bash-for-loop thegeekstuff.com/2011/07/bash-for-loop-examples
Sam

це не спричинить проблеми з файлами, що не містять 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

написати баш сценарій

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

або введіть його в однорядковій команді наступним чином:

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

Я сподіваюся, що це допомагає. У мене немає великої групи .pdfs для перевірки цього, але я використовую цю стратегію для перетворення моїх .flac файлів у .ogg файли.


чи можна це зробити, відкривши термінал у цій папці та запустивши команду, а не вставляючи шлях вручну?

Ви не можете вставити його тут як таке і вставити його у свою відповідь? це було б гарною відповіддю. я не зміг дійти до гарної формули, просто видаливши частину того, що ви розмістили

Знахідка та xargs, які я спочатку запропонував, не спрацювали, коли я отримав можливість перевірити їх.
cprofitt

1

Я маю подякувати спочатку Сему та Райану Томпсону , а також усім іншим відповідачам - за мою відповідь тут є не що інше, як варіація, що стосується можливості додати їх рішення до користувальницьких дій Thunar:

тому, як і будь-яка команда терміналу, команда для перетворення в текст усіх файлів PDF у папці може бути поміщена у список спеціальних дій у файловому менеджері Thunar

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

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

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

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

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

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

... це смішна команда, яку слід обережно використовувати: вона робиться для перетворення в текст всього pdf у папці, де він запускається, тож, якщо його помилково запустити у домашній папці, у нього з’являться небажані ефекти: всі ваші pdfs будуть перетворені в текст!

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

(Я б вітаю коментарі щодо того, як відкоригувати цю команду, щоб уникнути цього ризику.)

Замінивши те, що з іншим ( 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.