Я використовую Opensuse 10.3 і люблю знати інструменти командного рядка для пошуку фраз у великій кількості файлів PDF у каталозі. У Windows XP пошук Explorer дозволяє це, але занадто повільний. Чи є тут греп-поради?
Я використовую Opensuse 10.3 і люблю знати інструменти командного рядка для пошуку фраз у великій кількості файлів PDF у каталозі. У Windows XP пошук Explorer дозволяє це, але занадто повільний. Чи є тут греп-поради?
Відповіді:
SEARCH_DIR = "/ деякий / реж / де / ти / хочеш / шукати /"; SEARCH_STRING = "все, що ви шукаєте";
# вилучення тексту з PDF pdftotext "file.pdf" "file.txt" # з'єднання grep pdftotext "file.pdf" / dev / stdout | grep -H --label = "файл.pdf" - "$ SEARCH_STRING" # якщо ви хочете, щоб grep відображав лише список файлів відповідного pdf-файлу, додайте --files-with-match pdftotext "file.pdf" / dev / stdout | grep -H --label = "file.pdf" --файли-з-відповідниками - "$ SEARCH_STRING" # знайти можливий список PDF для пошуку знайти "$ SEARCH_DIR" -типу f -name '* .pdf'> список-pdf.txt
# все, що приєднується awk як клейка стрічка, відправляється в bash для обробки # подвійна цитата вимкнена, як x22 всередині awk. знайти "$ SEARCH_DIR" -типу f -name '* .pdf' | awk -v SEARCH_STRING = "$ SEARCH_STRING" '{ друкувати "pdftotext \ x22" $ 0 "\ x22 / dev / stdout | grep -H --label = \ x22" $ 0 "\ x22 - \ x22" SEARCH_STRING "\ x22" } '| баш
# З башти. Подальший процес відповідно до ваших потреб знайти "$ 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 "] у нас є відповідність [" ret "]"; # робити все, що завгодно. }; закрити (EXEC); } '
Під Linux і Windows можна використовувати Acrobat Reader, який має команду пошуку кількох файлів.
У Linux є Recoll, який створить індекс ваших pdf-файлів (та більше) під час першого запуску. Після побудови індексу пошук слів має бути дуже швидким; Пошук фрази повинен бути розумним. Переконайтесь, що pdftotext
команда встановлена, перш ніж запускати Recoll; під Debian і Ubuntu, це в poppler-utils
пакеті, я не знаю про Suse.
Або ви можете безпосередньо перетворити файли в текст і використовувати греп на текстових файлах за допомогою наведених нижче команд.
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
' та мітки з ім'ям файлу, а не filepath. ' ${0:2}
' знімає перші два символи $0
, тобто ' ./
', але це, мабуть, не розпізнається sh
.
Звичайно, підкоригуйте свої потреби.