Как искать содержимое нескольких файлов pdf?
Как я могу искать содержимое PDF-файлов в каталоге/подкаталоге? Я ищу некоторые инструменты командной строки. Кажется, что grep
не удается найти PDF-файлы.
12 ответов
ваш дистрибутив должен предоставить утилиту под названием pdftotext
:
find /path -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"' \;
" - " необходимо иметь вывод pdftotext в stdout, а не в файлы.
The --with-filename
и --label=
options поместит имя файла в вывод grep.
Необязательный --color
флаг хороший и говорит grep выводить с помощью цветов на терминале.
(В Ubuntu, pdftotext
идет xpdf-utils
или poppler-utils
.)
этот метод, используя pdftotext
и grep
, имеет преимущество над pdfgrep
если вы хотите использовать функции GNU grep
это pdfgrep
не поддерживает. Примечание: pdfgrep-1.3.X поддерживает -C
опция для печати строки контекста.
здесь pdfgrep, который делает именно то, что предполагает его название.
pdfgrep -R 'a pattern to search recursively from path' /some/path
я использовал его для простого поиска и он работал нормально.
(есть пакеты в Debian, Ubuntu и Fedora.)
начиная с версии 1.3.0 pdfgrep поддерживает рекурсивный поиск. Эта версия доступна в Ubuntu с Ubuntu 12.10 (Quantal).
вспомните это фантастическое полнотекстовое приложение для поиска GUI для Unix / Linux, которое поддерживает десятки различных форматов, включая PDF. Он даже может передать точный номер страницы и поискового запроса программа просмотра документов и, таким образом, позволяет перейти к результату прямо из ее интерфейса.
Recoll также поставляется с жизнеспособным интерфейсом командной строки и веб-интерфейс браузера.
моя фактическая версия pdfgrep (1.3.0) позволяет следующее:
pdfgrep -HiR 'pattern' /path
при выполнении pdfgrep --help
:
- H: печать имени файла для каждого совпадения.
- i: игнорировать различия в случаях.
- R: рекурсивный поиск каталогов.
Он хорошо работает на моем Ubuntu.
Я сделал это деструктивные небольшой скрипт. Повеселись с ним.
function pdfsearch()
{
find . -iname '*.pdf' | while read filename
do
#echo -e "3[34;1m// === PDF Document:3[33;1m $filename3[0m"
pdftotext -q -enc ASCII7 "$filename" "$filename."; grep -s -H --color=always -i "$filename."
# remove it! rm -f "$filename."
done
}
У меня была та же проблема, и поэтому я написал сценарий, который ищет все pdf-файлы в указанной папке для строки и печатает PDF-файлы, которые соответствуют строке запроса.
возможно, это будет полезно для вас.
можно скачать здесь
Если вы хотите видеть имена файлов с pdftotext использовать следующую команду:
find . -name '*.pdf' -exec echo {} \; -exec pdftotext {} - \; | grep "pattern\|pdf"
Мне нравится ответ @sjr, однако я предпочитаю xargs vs-exec. Я нахожу xargs более универсальным. Например, с -P мы можем воспользоваться несколькими процессорами, когда это имеет смысл.
find . -name '*.pdf' | xargs -P 5 -I % pdftotext % - | grep --with-filename --label="{}" --color "pattern"
существует общий ресурс с открытым исходным кодом grep tool crgrep который ищет в PDF-файлах, но и другие ресурсы, такие как контент, вложенный в архивы, таблицы базы данных, метаданные изображения, зависимости файлов POM и веб-ресурсы - и комбинации из них, включая рекурсивный поиск.
полное описание на вкладке "файлы" в значительной степени охватывает то, что поддерживает инструмент.
Я разработал crgrep как инструмент с открытым исходным кодом.
сначала конвертируйте все ваши pdf-файлы в текстовые файлы:
for file in *.pdf;do pdftotext "$file"; done
затем использовать grep
как обычно. Это особенно хорошо, так как это быстро, когда у вас есть несколько запросов и много PDF-файлов.
вам нужны некоторые инструменты, такие как pdf2text, чтобы сначала преобразовать pdf в текстовый файл, а затем искать внутри текста. (Вы, вероятно, пропустите некоторую информацию или символы).
Если вы используете язык программирования, вероятно, для этой цели написаны библиотеки pdf. например http://search.cpan.org/dist/CAM-PDF/ для Perl