Как искать содержимое нескольких файлов PDF? - PullRequest
200 голосов
/ 10 января 2011

Как я могу искать содержимое файлов PDF в каталоге / подкаталоге? Я ищу некоторые инструменты командной строки. Кажется, grep не может искать файлы PDF.

Ответы [ 12 ]

193 голосов
/ 25 марта 2011

Существует pdfgrep , который делает именно то, что предполагает его название.

pdfgrep -R 'a pattern to search recursively from path' /some/path

Я использовал его для простых поисков, и он работал нормально.

(есть пакеты в Debian, Ubuntu и Fedora.)

Начиная с версии 1.3.0 pdfgrep поддерживает рекурсивный поиск. Эта версия доступна в Ubuntu начиная с Ubuntu 12.10 (Quantal).

189 голосов
/ 10 января 2011

В вашем дистрибутиве должна быть утилита с именем pdftotext:

find /path -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"' \;

"-" необходимо для вывода pdftotext на стандартный вывод, а не на файлы.Опции --with-filename и --label= поместят имя файла в вывод grep.Необязательный флаг --color является хорошим и указывает grep выводить, используя цвета на терминале.

(В Ubuntu pdftotext предоставляется пакетом xpdf-utils или poppler-utils.)

Этот метод, использующий pdftotext и grep, имеет преимущество перед pdfgrep, если вы хотите использовать функции GNU grep, которые pdfgrep не поддерживает. Примечание : pdfgrep-1.3.x поддерживает опцию -C для печати строки контекста.

25 голосов
/ 29 мая 2013

Recoll - фантастическое приложение для полнотекстового поиска с графическим интерфейсом для Unix / Linux, которое поддерживает десятки различных форматов, включая PDF.Он может даже передавать точный номер страницы и поисковый запрос в просмотрщик документов и, таким образом, позволяет переходить к результату прямо из его графического интерфейса.

Recoll также поставляется с жизнеспособным интерфейсом командной строки и интерфейс веб-браузера .

12 голосов
/ 22 мая 2014

Моя актуальная версия pdfgrep (1.3.0) позволяет следующее:

pdfgrep -HiR 'pattern' /path

При выполнении pdfgrep --help:

  • H: печать имени файла для каждого совпадения.
  • i: игнорировать различия в регистре.
  • R: Поиск в каталогах рекурсивно.

Хорошо работает на моем Ubuntu.

7 голосов
/ 10 июня 2011

Я сделал этот разрушительный маленький скрипт. Веселитесь вместе с ним.

function pdfsearch()
{
    find . -iname '*.pdf' | while read filename
    do
        #echo -e "\033[34;1m// === PDF Document:\033[33;1m $filename\033[0m"
        pdftotext -q -enc ASCII7 "$filename" "$filename."; grep -s -H --color=always -i $1 "$filename."
        # remove it!  rm -f "$filename."
    done
}
2 голосов
/ 26 сентября 2014

Мне нравится ответ @ sjr, но я предпочитаю xargs vs -exec.Я считаю Xargs более универсальным.Например, с -P мы можем использовать преимущества нескольких процессоров, когда это имеет смысл.

find . -name '*.pdf' | xargs -P 5 -I % pdftotext % - | grep --with-filename --label="{}" --color "pattern"
2 голосов
/ 24 января 2013

Если вы хотите видеть имена файлов с pdftotext , используйте следующую команду:

find . -name '*.pdf' -exec echo {} \; -exec pdftotext {} - \; | grep "pattern\|pdf" 
2 голосов
/ 24 июня 2012

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

Возможно, это будет вам полезно,

Вы можете скачать его здесь

1 голос
/ 03 января 2016

Сначала преобразуйте все ваши PDF-файлы в текстовые файлы:

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

Затем используйте grep как обычно.Это особенно хорошо, так как это быстро, когда у вас есть несколько запросов и много файлов PDF.

1 голос
/ 23 октября 2013

Существует инструмент grep с открытым исходным кодом для общих ресурсов crgrep , который выполняет поиск в файлах PDF, а также в других ресурсах, таких как содержимое, вложенное в архивы, таблицы базы данных, метаданные изображений, зависимости файлов POM и веб-ресурсы, их комбинации, включая рекурсивный поиск.

Полное описание на вкладке "Файлы" в значительной степени описывает возможности инструмента.

Я разработал crgrep как инструмент с открытым исходным кодом.

...