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


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

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

adawdp

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

— На чужом компьютере тоже с Ubuntu нужно было найти среди многочисленных никак не систематизированных документов LO определённые документы по имеющимся в них записям а именно канадскому почтовому коду (индексу типа V3B 2T7).
— Никаких программ с графическим интерфейсом установлено не было. Grep как известно в документах OO, LO не ищет.
— Точно было известно, что документы небольшие потому задачу я решал не остро :)
Код: Bash
  1. DIRO=$(date +%Y%b%d%H%M%S)
  2. mkdir /tmp/$DIRO
  3. 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

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

adawdp

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

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

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4073
  • 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

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 5660
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Ну вот вам bash
Код: Bash
  1. #!/bin/bash
  2. #USAGE: ./script.name 'string_to_find' FILE[S]
  3.  
  4. for f in "${@:2}" ; do # список файлов : вся строка после 1-го аргумента
  5.     if unzip -ca "$f" content.xml | grep -qm 1 "$1" ; then
  6.         echo $f
  7.     fi
  8. done
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

adawdp

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

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

— Sudo я добавляю для того, чтобы уменьшить вывод, что в корне неверно :), это от лени, вместо того, чтобы поискать ключ который в find отвечает за избыточные уведомления…

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

Оффлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 5660
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
adawdp, Если Вам не понравился доработанный вариант от alsoijw в виде
Код: Bash
  1. find /media/fjf/MYCOP -name "*.odt" -print0 2>/dev/null | xargs -0 ./script.name 'string_to_find' $()
то могу доработать Ваш:
Код: Bash
  1. 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
  1. find . -name '*.pdf' -exec pdftotext {} - \;
  2. find . -type f -iname '*pdf' -print0 | xargs -0 pdfgrep -i 'что ищем'
  3.  
— Можно также что-составить для Word'овских документов через catdoc или antiword
— Странно, что подобные вопросы не часто поднимаются на форуме такое впечатление, что все уже всё нашли! :)

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

 

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