Я використовую 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.
Звичайно, підкоригуйте свої потреби.