Інструмент командного рядка для пошуку фраз у великій кількості файлів PDF


9

Я використовую Opensuse 10.3 і люблю знати інструменти командного рядка для пошуку фраз у великій кількості файлів PDF у каталозі. У Windows XP пошук Explorer дозволяє це, але занадто повільний. Чи є тут греп-поради?



Я хочу дізнатися спочатку інструменти командного рядка, і якщо є інструменти графічного інтерфейсу, то його також буде непогано. Wingrep є лише під Windows. І я хочу шукати лише файли у форматі PDF, тому додаток, оптимізований для цього, було б непогано мати
iceman

Відповіді:


6
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);
} '

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

@Synetech: Він відхилив відповідь: "Wingrep є лише під Windows", що говорить про те, що він хоче рішення Linux.
Механічний равлик

@Mechanicalsnail він відхилив його, оскільки це інструмент GUI, де попросив інструмент командного рядка.
Synetech

3

Під 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 "регулярний вираз для пошуку"

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' та мітки з ім'ям файлу, а не filepath. ' ${0:2}' знімає перші два символи $0, тобто ' ./', але це, мабуть, не розпізнається sh.

Звичайно, підкоригуйте свої потреби.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.