Я использую 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.
Конечно, подстраивайтесь под свои нужды.