LINUX.ORG.RU

Поиск по содержимому .doc/.odt

 ,


0

1

Привет! Есть потребность найти по строке .doc или .odt файл. Как написать портянку на баше, которая будет это делать, я приблизительно представляю. Но нужна утилита, которая умеет работать с доком (потом можно сделать вариант и для одт). Про catdoc и antiword я в курсе. Но у меня они не срабатывают. После catdoc ничего не происходит. После антиворда наблюдаю следующее: I'm afraid the text stream of this file is too small to handle

Вобщем, нужна утилита, могущая открыть док, чтобы дальше выполнить там поиск с помощью grep. Ваши идеи?

.odt и .docx это обычный zip с xml — распакуй и грепай.
С .doc которые были бинарные сложнее, но можно пересохранить в формате .docx, если catdoc не работает.

imul ★★★★★
()
Ответ на: комментарий от Bagrov

Это я знаю. Не работает. Нужно добавить /bin в $PATH.

anti_win ★★
() автор топика
Ответ на: комментарий от Bagrov

Дополню, что у меня catdoc работает, но только на doc, а не docx. Протестировал odt2txt – тоже всё в порядке. В отличие от docx2txt, обе эти утилиты по умолчанию пишут в stdout.

Bagrov ★★★★★
()
Ответ на: комментарий от Bagrov

Стоп! Добавил минус — и зарабоатло! Что этот аргумент делает.

anti_win ★★
() автор топика
Ответ на: комментарий от Bagrov

man пишет, что справочной страницы нет. Будем в интернетах шарить.

anti_win ★★
() автор топика
Ответ на: комментарий от Bagrov

Понял! Минус перенаправляет результат чтения в STDOUT, который, как я понимаю, является переменной, из которой баш читает результаты работы команд.

anti_win ★★
() автор топика
Ответ на: комментарий от anti_win

Нет. Stdout это стандартный поток вывода. Есть еще stderr и stdin. По названиям понятно, что это потоки для вывода «ошибок» и поток ввода.

imul ★★★★★
()
Последнее исправление: imul (всего исправлений: 1)

Всем спасибо за советы! Я написал два скрипта для докса и одт. Потом солью их в один, наверно :)

anti_win ★★
() автор топика
Ответ на: комментарий от anti_win

recoll. индексированный поиск. Grep внутри есть.

anonymous
()
Ответ на: комментарий от imul

В конечном счете все данные в памяти – это какие-то переменные. Если тут есть сишники, они могут подробно рассказать, где что хранится, какие программы какие вызовы дергают, кто куда пишет и кто откуда читает, и что именно делает bash на низком уровне, когда создает пайп.

Но пользователю, конечно, лучше абстрагироваться от низов и считать переменные одним классом сущностей, потоки – другим, сокеты – третьим, файлы – четвертым.

Bagrov ★★★★★
()
Ответ на: комментарий от Bagrov

Ну как бы абстракции операционными системами и стандартными библиотеками и реализуются, чтобы не велосипедить.

imul ★★★★★
()

Выношу свой велосипед на суд народный:

#! /bin/bash

export PATH=$PATH:/bin
export IFS=$'\n'

LIST=`find $1 -name "*.docx"` 
for i in $LIST
do
if [ "`docx2txt $i -| grep -i $2`" ]
then
echo $i
fi
done

Интересует ваше мнение. Приветствуется объективная критика по существу.

anti_win ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.