Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Контекстный поиск из терминала в многочисленных документах LibreOffice, как?  (Прочитано 1236 раз)

0 Пользователей и 1 Гость просматривают эту тему.

adawdp

  • Автор темы
  • Гость
2016 Jun 03; 01:23 PM; Oakville, ON, Canada.

— На чужом компьютере тоже с Ubuntu нужно было найти среди многочисленных никак не систематизированных документов LO определённые документы по имеющимся в них записям а именно канадскому почтовому коду (индексу типа V3B 2T7).
— Никаких программ с графическим интерфейсом установлено не было. Grep как известно в документах OO, LO не ищет.
— Точно было известно, что документы небольшие потому задачу я решал не остро :)
Код: (bash) [Выделить]
DIRO=$(date +%Y%b%d%H%M%S)
mkdir /tmp/$DIRO
find . -iname "*.odt" -exec cp "{}" /tmp/$DIRO \;
— Скопировал файлы в одну директорию, затем распаковал все файлы из nautilus'a, потом с помощью grep получил выдачу вида HeightEyeColour.odt_FILES/content.xml
— Часть наименования директории (HeightEyeColour.odt) как раз и есть имя нужного файла.

— Вопрос простой есть ли у кого готовые отработанные решения контекстного поиска по множеству документов LO,OO можно также Word из терминала?

— Может кто применял zgrep или odt2txt, а также antiword для рекурсивного контекстного поиска с find или ещё как?

— Ну не считаю я необходимым если одно-двухстарничных документов сотни полторы от силы ставить для этого Recoll…

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
adawdp, добавить в твой скрипт распоковку и поиск и готово будет.
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

adawdp

  • Автор темы
  • Гость
2016 Jun 03; 01:48 PM

Alsoijw, ну этот путь понятен, но он мне не кажется красивым :(, всё же копирование файлов… Это что никак не обойти?
А вдруг когда-то нужно будет искать в больших файлах или их станет очень много…

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Накидал по быстрому решение на fish. Лень писать на баше, но портировать на баш проще простого. Что делает скрипт? В первой строке мы говорим перебирать среди всех файлов, возвращённых командой(в данном случае ls). Во второй строке в скобках мы заставляем^W вежливо просим unzip извлечь файл(odt это обычные zip архивы), после чего перегонем его grep.
Если grep что-то нашёл, то выводим имя файла. Может есть варианты лучше, но ко мне они не приходят.
for f in (ls) # вместо ls подставить команду, возвращающую список файлов
  set r (unzip -ca $f content.xml | grep 'что ищем') # аргументы -ca выводят файл в стандартный поток вывода
  if [ $r ]
    echo $f # можно дописать $r, тогда напечатает то что grep нашёл
  end
end
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

adawdp

  • Автор темы
  • Гость
2016 Jun 03; 05:50 PM

Alsoijw, спасибо!
— О том как «портировать на баш проще простого» :) я Вам напишу в красках или стихах или в красочных стихах как только приеду с работы!
—  Заодно почитаю что это за Зверь-РЫБА такая :) этот Ваш FISH !

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Ну вот вам bash
Код: (bash) [Выделить]
#!/bin/bash
#USAGE: ./script.name 'string_to_find' FILE[S]

for f in "${@:2}" ; do # список файлов : вся строка после 1-го аргумента
    if unzip -ca "$f" content.xml | grep -qm 1 "$1" ; then
        echo $f
    fi
done
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

adawdp

  • Автор темы
  • Гость
2016 Jun 04; 03:24 PM

Azure, спасибо всегда, а то я ещё bash «неасилил» , как говорит «нынешняя молодёжь» :), а тут бы ещё и fish пришлось бы учить! А жить когда? :)
— Есть два варианта (в смысле я пробовал два, конечно же есть больше, думаю) как дать возможность grep прочитать .odt, или вот как-то так начать, через unzip  :
Код: (bash) [Выделить]
for f in *.odt; do unzip -p $f content.xmlили вот так начать через odt2txt :
Код: (bash) [Выделить]
find . -name "*.odt" | while read i; do odt2txt "$i"— Лучше  у меня получается через odt2txt
Код: (bash) [Выделить]
sudo find /media/fjf/MYCOP -name "*.odt" | while read i; do odt2txt "$i" | grep -Hl --label="$i"  текст; done
— Sudo я добавляю для того, чтобы уменьшить вывод, что в корне неверно :), это от лени, вместо того, чтобы поискать ключ который в find отвечает за избыточные уведомления…

— Конечно медленно всё это дело проистекает, нужно также решить ходить поиску по ссылкам не ходить, но в «черне» работает, подрихтовать и можно будет использовать…

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
adawdp, Если Вам не понравился доработанный вариант от alsoijw в виде
Код: (bash) [Выделить]
find /media/fjf/MYCOP -name "*.odt" -print0 2>/dev/null | xargs -0 ./script.name 'string_to_find' $() то могу доработать Ваш:
Код: (bash) [Выделить]
find /media/fjf/MYCOP -name "*.odt" -exec bash -c 'odt2txt $0 | grep -Hl --label="$0"  текст' {} \; 2>/dev/null
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

adawdp

  • Автор темы
  • Гость
2016 Jun 04; 06:40 PM

— Спасибо, Azure, я полагаю этого достаточно… Был вопрос о медленной работе, но это какая-то особенность работы команды или может у меня что-то не так на компьютере. В общем не происходит завершение работы команды, а я думал что по прежнему идёт исполнение команды.

— Приблизительно по такому же принципу можно искать в текстовых PDF что-то наподобие:
Код: (bash) [Выделить]
find . -name '*.pdf' -exec pdftotext {} - \;
find . -type f -iname '*pdf' -print0 | xargs -0 pdfgrep -i 'что ищем'
— Можно также что-составить для Word'овских документов через catdoc или antiword
— Странно, что подобные вопросы не часто поднимаются на форуме такое впечатление, что все уже всё нашли! :)

Пользователь добавил сообщение 05 Июня 2016, 04:27:15:
2016 Jun 04; 09:29 PM
— Скорее всего команда не завершалась из-за того, что исполнялась  разделе, который обычно не подключен за ненадобностью, монтируется по необходимости…
Код: (bash) [Выделить]
/media/fjf/MYCOP
« Последнее редактирование: 05 Июня 2016, 04:29:27 от adawdp »

 

Страница сгенерирована за 0.044 секунд. Запросов: 25.