Я использую Opensuse 10.3 и хотел бы знать инструменты командной строки для поиска фраз в большом количестве PDF-файлов внутри каталога. В Windows XP поиск в проводнике позволяет это сделать, но он слишком медленный. Есть ли здесь советы по grep?
Я использую Opensuse 10.3 и хотел бы знать инструменты командной строки для поиска фраз в большом количестве PDF-файлов внутри каталога. В Windows XP поиск в проводнике позволяет это сделать, но он слишком медленный. Есть ли здесь советы по grep?
Ответы:
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); }»
В 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 "регулярное выражение для поиска"
pdftotext
(какие инструменты, такие как Recoll, будут делать автоматически).
Adobe Reader X делает работу , и это делает позволяет поиск под весь каталог и подкаталоги, а не только внутри файла, но это не программа командной строки.
recoll
Устанавливается на Debian легко, теперь пытается сделать его пригодным для моих сотрудников на базе Windows.
Чтобы рекурсивно перечислить все файлы в вашем домашнем каталоге, которые имеют расширение 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
.
Конечно, подстраивайтесь под свои нужды.