Инструмент командной строки для поиска фраз в большом количестве PDF-файлов


9

Я использую Opensuse 10.3 и хотел бы знать инструменты командной строки для поиска фраз в большом количестве PDF-файлов внутри каталога. В Windows XP поиск в проводнике позволяет это сделать, но он слишком медленный. Есть ли здесь советы по grep?



Сначала я хочу узнать инструменты командной строки, и если есть инструменты с графическим интерфейсом, то это тоже будет хорошо .. Wingrep работает только под Windows. И я хочу искать только PDF-файлы, поэтому было бы неплохо иметь оптимизированное для этого приложение
Iceman

Ответы:


6
SEARCH_DIR = "/ некоторые / реж / где / вы / хотите / к / поиск /";
SEARCH_STRING = "все, что Вы в-поиск";
# извлечение текста из PDF
pdftotext "file.pdf" "file.txt"

# соединение с grep
pdftotext "file.pdf" / dev / stdout | grep -H --label = "file.pdf" - "$ SEARCH_STRING"

# если вы хотите, чтобы grep отображал только список файлов соответствующих PDF-файлов, добавьте --files-with-match
pdftotext "file.pdf" / dev / stdout | grep -H --label = "file.pdf" --files-with-matchs - "$ SEARCH_STRING"

# найти возможный список PDF для поиска
найти тип $ SEARCH_DIR f -name '* .pdf'> list-of-pdf.txt
# все, к чему присоединяется awk как клейкая лента, отправляется в bash для обработки
# двойная кавычка экранируется как x22 внутри awk.
find "$ SEARCH_DIR" -типа f -name '* .pdf' | awk -v SEARCH_STRING = "$ SEARCH_STRING" '{
print "pdftotext \ x22" $ 0 "\ x22 / dev / stdout | grep -H --label = \ x22" $ 0 "\ x22 - \ x22" SEARCH_STRING "\ x22"
} '| bash

# Без Баш. Дальнейший процесс в соответствии с вашими потребностями
найти "$ SEARCH_DIR" -типа f -name '* .pdf' | awk -v SEARCH_STRING = "$ SEARCH_STRING" '
{
EXEC = "pdftotext \ x22" $ 0 "\ x22 / dev / stdout | grep -H --label = \ x22" $ 0 "\ x22 - \ x22" SEARCH_STRING "\ x22";
while (EXEC | getline ret) {
 print "Для файла [" $ 0 "] у нас есть match [" ret "]";
 # делай что хочешь. 
};
закрыть (EXEC);
}»

Я полагаю, вы не заметили ту часть вопроса, в которой упоминалось «Windows XP» или тег поиска Windows . Я знаю, что вопрос (в замешательстве) начался с «openSUSE» , но ссылок на Windows больше, чем ссылок на Linux; особенно если учесть его последующий комментарий .
Synetech

@Synetech: он отклонил ответ «Wingrep только под Windows», что говорит о том, что он хочет решение Linux.
Механическая улитка

@Mechanicalsnail, он отклонил его, потому что это инструмент с графическим интерфейсом, где запросили инструмент командной строки.
Synetech

3

В Linux и Windows вы можете использовать Acrobat Reader, в котором есть команда для поиска по нескольким файлам.

Под Linux есть Recoll, которая создаст индекс ваших pdf-файлов (и более) при первом запуске. После построения индекса поиск слов должен быть очень быстрым; поиск фразы должен быть разумным. Убедитесь, что pdftotextкоманда установлена ​​перед запуском Recoll; под Debian и Ubuntu, это в poppler-utilsпакете, я не знаю о Suse.

Или вы можете напрямую преобразовать файлы в текст и использовать grep для текстовых файлов с помощью команд ниже.

find -name '* .pdf' -exec pdftotext {} \;
grep -r --include '* .txt' -l -F "точная фраза для поиска"
grep -r --include '* .txt' -l -E "регулярное выражение для поиска"

Adobe не разрешит поиск по всему каталогу, он будет делать это только внутри файла. Сначала я хочу узнать инструменты командной строки, и если есть инструменты с графическим интерфейсом, то это тоже будет хорошо
Iceman

Adobe Reader 9 под Linux имеет пункт меню «Редактировать | Поиск», который позволяет вам искать во всех файлах PDF в каталоге. В командной строке все методы, о которых я знаю, включают шаг pdftotext(какие инструменты, такие как Recoll, будут делать автоматически).
Жиль "ТАК ... перестать быть злым"

1
+1 для Recoll. Индексирование файлов сэкономит время, если у вас много и вы часто ищете их.
Механическая улитка

1

Adobe Reader X делает работу , и это делает позволяет поиск под весь каталог и подкаталоги, а не только внутри файла, но это не программа командной строки.


это в последней версии Acrobat X? какой релиз?
Iceman

Я попробовал инструмент индексирования Acrobat и назвал его примитивным комплиментом. recollУстанавливается на Debian легко, теперь пытается сделать его пригодным для моих сотрудников на базе Windows.
Крис К

0

Чтобы рекурсивно перечислить все файлы в вашем домашнем каталоге, которые имеют расширение PDF и содержат строку, например, соответствующую регулярному выражению ' [iI]n Haskell', вы можете выполнить:

find ~/ -regextype posix-extended -regex '.*\.pdf' -execdir sh -c 'pdftotext "$0" - | grep -El --label="$PWD${0#?}" "$1"' {} '[iI]n Haskell' \;

Примечания:

  • Хотя это и не особенно необходимо для этого примера, я создал это, избегая использования -execили xargsпотому что, по соображениям безопасности , я думаю, что это хорошая практика, чтобы привыкнуть к этому. Изменение ' -execdir' на ' -exec' и ' $PWD${0#?}' на ' $0' должно привести к тому же результату в этом случае.
  • Вместо использования глобусов для сопоставления с образцом имен файлов, может быть полезно использовать большую выразительную силу регулярных выражений и сопоставление с образцом по всему пути. Я включил здесь практику, чтобы показать, как это можно сделать. Обратите внимание, что путь, с которым сопоставляется шаблон, - это путь, который обычно печатается. Относительно ли это относительного или абсолютного, зависит от заданного аргумента (ов) пути, который, если передан по умолчанию, является текущим рабочим каталогом (' ./'). В этом примере все сопоставленные пути являются абсолютными (т. Е. Начинаются с ' /'), потому что ' ~/' раскрывается до абсолютного пути к домашнему каталогу текущего пользователя и является единственным аргументом пути.
  • ' $0' И ' $1' - это позиционные параметры, используемые для правильного цитирования аргументов. Если это не сделано правильно, команда уязвима для произвольных имен файлов.
  • ' ${0#?}' лишает первого символа $0, то есть ' .'.

Для печати каждой подходящей строки следует имя файла:

find ~/ -regextype posix-extended -regex '.*\.pdf' -execdir bash -c 'pdftotext "$0" - | grep -EH --label="${0:2}" "$1"' {} '[iI]n Haskell' \;

Этот вариант использует ' -H' вместо ' -l' и помечает имя файла, а не путь к файлу. ' ${0:2}' удаляет первые два символа $0, то есть ' ./', но, очевидно, не распознается sh.

Конечно, подстраивайтесь под свои нужды.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.