Как искать содержимое нескольких файлов PDF?

227

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

Джестин Джой
источник
5
Grep не будет работать, поскольку PDF является двоичным форматом, а текст часто сжимается или кодируется различными способами.
отметьте Стивенса
4
Вот решение с графическим интерфейсом: Adobe Reader, см. Wikispaces.psu.edu/display/training/…
Мартин Тома
3
Связанный: unix.stackexchange.com/questions/6704/grep-pdf-files
поток
3
Adobe Reader работает нормально, но не индексирует; так что если у вас много файлов, это будет медленно. Любое решение для индексирования?
Рубин

Ответы:

211

Ваш дистрибутив должен предоставлять утилиту под названием 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опцию для печати строки контекста.

SJR
источник
1
@Kurt Pfeifle Правка "(Edit by -kp-)", которую вы сделали, не работает, так как grepфильтрует напечатанные имена файлов.
Рафаэль Аренс
@ sjr нет, хотя pdfgrepрешение подходит для действительно быстрых и простых поисков, часто я хочу получить некоторый контекст, так как одна строка не будет достаточно полезной - поэтому, как я добавил в ответ: например, вы можете добавить опция -C5 перед «вашим шаблоном» включает 5 строк контекста в вывод - pdfgrep не поддерживает это
Colin D Bennett
о, это круто, рад знать, что в этом есть свои преимущества, хотя для большинства людей это гораздо менее очевидно, чем он занимается
sjr
2
@sjr Просто для справки: я использую Ubuntu 12.10 и pdfgrepбесполезен, он сообщает об огромном количестве мусора в файлах, которые он не может обработать. Ваше решение с другой стороны помогло. Поэтому, пожалуйста, не удаляйте его, даже через 3 года это все еще полезно!
Али
Я смог использовать его и в cygwin, хотя для того, чтобы сделать его функцией с параметром, мне пришлось сделать your_pattern '$ 1'
Koshmaar
215

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

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

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

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

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

Graeme
источник
1
От Natty (Ubuntu 11.04) и выше (см. Packages.ubuntu.com/… )
Мартин Тома
2
У @pavon pdfgrepтеперь есть возможность рекурсии, в том числе -Rи по символическим
ссылкам
30

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

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

Glutanimate
источник
1
@Glutanimate Было бы полезно (и мне, и, возможно, другим) также, если бы вы могли добавить пример, относящийся к исходному вопросу (инструмент командной строки для поиска нескольких PDF-файлов): я также хотел бы посмотреть, как выполнять поиск по шаблону и как искать текущий каталог , включая все подкаталоги . Как это будет выглядеть recoll / xapianв командной строке (без графического интерфейса)? Спасибо!
сумасшедший о изящном
@ LeszekŻarna Возможно, вы могли бы опубликовать пример, который вы тестировали?
Сумасшедший о хорошей
Руководство recoll пользователя может содержать некоторые указатели, но предлагает довольно техническое и «не по теме» прочтение ...
чокнутый про natty
1
@nutty: recoll -t -q dir: pwdext: pdf 'neuro *' - переполнение стека сгребло галочки вокруг pwd.
Медок
13

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

pdfgrep -HiR 'pattern' /path

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

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

Это хорошо работает на моем Ubuntu.

arkhi
источник
7

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

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
+1. Но вместо того, чтобы $filename.вы пошли на это grep.
Рафаэль Аренс
3

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

find . -name '*.pdf' | xargs -P 5 -I % pdftotext % - | grep --with-filename --label="{}" --color "pattern"
Деян
источник
Интересный момент о возможности xargsпараллельной обработки. Обратите внимание, что ваш --labelпараметр-аргумент будет в буквальном смысле {} , потому что grepкоманда больше не выполняется в контексте findс exec.
mklement0
2

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

Может быть, это будет полезно для вас.

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

Пол Вейберт
источник
может быть полезно поставить скрипт в комментарии?
Baxx
Я попробовал ваш сценарий, и он оказался намного медленнее, чем pdfgrepрешение или однострочная строка sjr, и у меня остался непрерывный процесс, использующий 100% потока ЦП, даже после того, как я Ctrl-C завершил его.
Джейсон
2

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

find . -name '*.pdf' -exec echo {} \; -exec pdftotext {} - \; | grep "pattern\|pdf" 
Алексей Концевич
источник
2

Существует еще одна утилита под названием ripgrep-all , которая основана на ripgrep .

Он может обрабатывать не только документы PDF, например документы Office и фильмы, и автор утверждает, что это быстрее, чем pdfgrep.

Синтаксис команды для рекурсивного поиска в текущем каталоге, а второй ограничивается только файлами PDF:

rga 'pattern' .
rga --type pdf 'pattern' .
oschoudhury
источник
1

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

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

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

Craig
источник
Крейг - есть ли у вас связь с этим проектом? Если это так, вы должны указать это в своем ответе. Я говорю это, потому что вы только что опубликовали практически идентичный ответ на два других старых вопроса ...
Стивен С.
Обновленный пост, чтобы уточнить, что я являюсь автором crgrep
Крейг
1

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

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

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

Мартин Тома
источник
Это, когда сделано в комбинации с ag github.com/ggreer/the_silver_searcher . Способен анализировать у психоделиков Gb за микросекунды. Плоские файлы для жизни
NVRM
0

Вам нужны некоторые инструменты, такие как pdf2text, чтобы сначала преобразовать ваш pdf в текстовый файл, а затем искать внутри текста. (Вы, вероятно, пропустите некоторую информацию или символы).

Если вы используете язык программирования, вероятно, для этой цели написаны библиотеки pdf. например, http://search.cpan.org/dist/CAM-PDF/ для Perl

Нейлоновая улыбка
источник
0

попробуйте использовать 'acroread' в простом скрипте, подобном приведенному выше

acathur
источник