Jak przekonwertować wszystkie pliki pdf na tekst (w folderze) za pomocą jednego polecenia?

18

Wiem, że mogę konwertować pliki pdf do plików tekstowych jeden po drugim w następujący sposób:

$ pdftotext filename.pdf

Ale czy istnieje jedno polecenie, które dokonałoby tej konwersji bez określania osobnych nazw plików, aby przekonwertować je wszystkie?

Widzę tutaj, na Wikipedii , że „Symbole wieloznaczne (*), na przykład $ pdftotext * pdf, do konwersji wielu plików, nie mogą być używane, ponieważ pdftotext oczekuje tylko jednej nazwy pliku”.


źródło

Odpowiedzi:

23

Następujące konwertują wszystkie pliki w bieżącym katalogu:

for file in *.pdf; do pdftotext "$file" "$file.txt"; done
Sam
źródło
jest to jedyne polecenie, które można wpisać w jednym wierszu w terminalu (pdftotext wewnątrz pętli for w składni jednowierszowej, o co poprosił op)
Sam
sprawdź te linki, aby uzyskać więcej informacji o działaniu pętli for: cyberciti.biz/faq/bash-for-loop thegeekstuff.com/2011/07/bash-for-loop-examples
Sam
czy nie spowoduje to problemów z plikami innymi niż pdf?
cprofitt
Czy nie stworzy to plików takich jak „filename.pdf.txt”?
Ryan C. Thompson
tak, jeśli to jest problem, moglibyśmy usunąć rozszerzenie .pdf za pomocą „sed” lub „awk”, ale zwiększyłoby to złożoność polecenia
Sam
8
ls *.pdf | xargs -n1 pdftotext

xargsjest często szybkim rozwiązaniem do wielokrotnego uruchamiania tego samego polecenia za każdym razem z niewielką zmianą. Ta -n1opcja zapewnia, że ​​tylko jeden plik pdf jest przekazywany do pdftotext na raz.

Edycja: Jeśli martwisz się spacjami w nazwach plików i tym podobne, możesz użyć tej alternatywy:

find . -name '*.pdf' -print0 | xargs -0 -n1 pdftotext
Ryan C. Thompson
źródło
proszę zobaczyć moją odpowiedź: czy to polecenie można dostosować, aby uniknąć wspomnianego tam problemu? to nie znaczy, że twoje rozwiązanie nie jest dobre, wręcz przeciwnie, robi coś bardzo specyficznego, czego nie oferują inne alternatywy. ale byłem po prostu ciekawy
2
Alternatywnie:ls *.pdf | xargs -L1 -I% pdftotext % %.txt
kenorb
2

napisz skrypt bash

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

lub wpisz polecenie w jednym wierszu w następujący sposób:

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

Mam nadzieję, że to pomoże. Nie mam dużej grupy plików .pdf do przetestowania tego, ale używam tej strategii do konwertowania plików .flac na pliki .ogg.

cprofitt
źródło
czy można to zrobić, otwierając terminal w tym folderze i uruchamiając polecenie zamiast ręcznie wstawiać ścieżkę?
czy nie możesz go tutaj wkleić i wstawić do swojej odpowiedzi? to byłaby dobra odpowiedź. nie udało mi się osiągnąć dobrej formuły, usuwając tylko część tego, co
znalezione przeze mnie i xargs początkowo nie działały, gdy miałem okazję je przetestować.
cprofitt,
1

Muszę najpierw podziękować Samowi i Ryanowi Thompsonowi, a także wszystkim innym osobom odpowiadającym - ponieważ moja odpowiedź jest niczym innym, jak tylko odmianą dotyczącą możliwości dodania ich rozwiązań do niestandardowych działań Thunara:

tak jak każde polecenie terminalu, polecenie konwersji na tekst wszystkich plików pdf w folderze można umieścić na liście niestandardowych działań w menedżerze plików Thunar

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

Jest takie polecenie find . -name '*.pdf' -print0 | xargs -0 -n1 pdftotext(pochodzące od Ryana Thompsona ), którego wolę używać, ale ma paskudny obrót ... patrz poniżej ...

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

... to zabawne polecenie, którego należy używać ostrożnie: służy do konwersji na tekst wszystkich plików pdf w folderze, w którym jest uruchamiany, więc jeśli zostanie zwolniony przez pomyłkę w folderze domowym, będzie miał trochę niechcianych efekty: wszystkie twoje pliki pdf zostaną przekonwertowane na tekst!

(Przetestowałem to w ten sposób: utworzyłem folder o nazwie „test” na pulpicie, aw nim plik pdf i serię folderów w folderach ( /Desktop/test/a/b/c/e/f/g/h/i), z których każdy zawiera ten sam plik pdf. Uruchomienie tego polecenia /Desktop/testprzekonwertowało wszystkie pliki pdf na pliki w formacie folder „i”).

(Z zadowoleniem przyjmuję komentarze na temat dostosowania tego polecenia, aby uniknąć tego ryzyka).

Zastąpienie go innym ( for file in *.pdf; do pdftotext "$file" "$file.txt"; done) pochodzącym od Sama pozwala uniknąć tego problemu.

Ale w niektórych przypadkach można sobie życzyć dokładnie tego, co robi rozwiązanie Ryana!

Społeczność
źródło
1
Za pomocą można uniknąć findwyszukiwania poleceń w podkatalogach -maxdepth 1. Również, gdy wprowadzenie go do akcji niestandardowych funkcji thunar użytkownika, należy prawdopodobnie zastąpi find .w find %Fcelu umożliwienia Thunar prawidłowo przechodzić ścieżki wybranych katalogów.
Ryan C. Thompson,
0
for file in *.pdf; do pdftotext "$file" "$file.txt"; done

Ten jeden wyjścia sample.pdf.txt .

Próbowałem użyć tego, jak sugerują user2357111317, i dołączam także -layout, aby zachować układ tekstu

for file in *.pdf; do pdftotext -layout "$file"; done
hinky
źródło