Как я могу искать содержимое файлов PDF в каталоге/подкаталоге? Я ищу некоторые инструменты командной строки. Кажется, что grep
не может искать файлы PDF.
Как искать содержимое нескольких файлов PDF?
Ответ 1
В вашем дистрибутиве должна быть утилита под названием pdftotext
:
find /path -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"' \;
"-" необходим для вывода pdftotext в stdout, а не в файлы.
Параметры --with-filename
и --label=
помещают имя файла в вывод grep.
Необязательный флаг --color
хорош и сообщает grep для вывода с использованием цветов на терминале.
(В Ubuntu pdftotext
предоставляется пакет xpdf-utils
или poppler-utils
.)
Этот метод, используя pdftotext
и grep
, имеет преимущество перед pdfgrep
, если вы хотите использовать функции GNU grep
, которые pdfgrep
не поддерживает. Примечание: pdfgrep-1.3.x поддерживает опцию -C
для печати строки контекста.
Ответ 2
Существует pdfgrep, что делает то, что предлагает его название.
pdfgrep -R 'a pattern to search recursively from path' /some/path
Я использовал его для простых поисков, и он работал нормально.
(В Debian, Ubuntu и Fedora есть пакеты.)
Так как версия 1.3.0 pdfgrep поддерживает рекурсивный поиск. Эта версия доступна в Ubuntu с Ubuntu 12.10 (Quantal).
Ответ 3
Recoll - фантастическое полнотекстовое приложение для поиска графического интерфейса для Unix/Linux, которое поддерживает десятки различных форматов, включая PDF. Он даже может передавать точный номер страницы и поисковый запрос запроса в средство просмотра документов и, таким образом, позволяет перейти к результату прямо из своего графического интерфейса.
Recoll также поставляется с жизнеспособным интерфейсом командной строки и интерфейсом веб-браузера.
Ответ 4
Моя фактическая версия pdfgrep (1.3.0) позволяет:
pdfgrep -HiR 'pattern' /path
При выполнении pdfgrep --help
:
- H: напечатать имя файла для каждого соответствия.
- i: игнорировать различия в событиях.
- R: каталоги поиска рекурсивно.
Это хорошо работает на моем Ubuntu.
Ответ 5
Я сделал этот деструктивный маленький script. Получайте удовольствие от этого.
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
}
Ответ 6
Мне нравится @sjr answer, но я предпочитаю xargs vs -exec. Я нахожу xargs более универсальным. Например, с помощью -P мы можем использовать несколько процессоров, когда имеет смысл это сделать.
find . -name '*.pdf' | xargs -P 5 -I % pdftotext % - | grep --with-filename --label="{}" --color "pattern"
Ответ 7
У меня была такая же проблема, и поэтому я написал script, который ищет все файлы PDF в указанной папке для строки и печатает файлы PDF, которые соответствуют строке запроса.
Возможно, это будет полезно для вас.
Вы можете скачать его здесь
Ответ 8
Если вы хотите увидеть имена файлов с pdftotext, используйте следующую команду:
find . -name '*.pdf' -exec echo {} \; -exec pdftotext {} - \; | grep "pattern\|pdf"
Ответ 9
Существует открытый ресурс grep с открытым исходным кодом crgrep, который выполняет поиск в файлах PDF, а также другие ресурсы, такие как содержимое, вложенное в архивы, базу данных таблицы, метаданные изображений, зависимости POM файлов и веб-ресурсы - и их комбинации, включая рекурсивный поиск.
Полное описание под вкладкой "Файлы" в значительной степени охватывает то, что поддерживает инструмент.
Я разработал crgrep в качестве инструмента с открытым исходным кодом.
Ответ 10
Сначала конвертируйте все ваши pdf файлы в текстовые файлы:
for file in *.pdf;do pdftotext "$file"; done
Затем используйте grep
как обычно. Это особенно хорошо, так как это быстро, когда у вас есть несколько запросов и много файлов PDF.
Ответ 11
Вам нужны такие инструменты, как pdf2text, чтобы сначала преобразовать ваш pdf файл в текстовый файл, а затем выполнить поиск внутри текста. (Возможно, вы пропустите некоторую информацию или символы).
Если вы используете язык программирования, для этой цели, вероятно, существуют библиотеки PDF. например http://search.cpan.org/dist/CAM-PDF/ для Perl
Ответ 12
Существует еще одна утилита под названием ripgrep-all, основанная на ripgrep.
Он может обрабатывать не только документы PDF, например документы и фильмы Office, и автор утверждает, что это быстрее, чем pdfgrep
.
Синтаксис команды для рекурсивного поиска в текущем каталоге, а второй ограничивается только файлами PDF:
rga 'pattern' .
rga --type pdf 'pattern' .
Ответ 13
попробуйте использовать 'acroread' в простой script, как и выше