Поиск текста внутри zip

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

Ответить
azsx
Сообщения: 3684
ОС: calculate linux, debian, ubuntu

Поиск текста внутри zip

Сообщение azsx »

Что у меня есть. У меня есть в каталоге много подкаталогов, в них файлы zip. В каждом zip файле xml файлы. Например, сейчас 66810 файлов zip, 1609 каталогов и 20,6 гб. (будет больше, каждый день файлы добавляются иногда меняются). Мне надо искать несвязные строки текста (без привязки к словам и регистру). В винде для этого есть хорошая программа. Судя по всему в линукс аналогом для консоли будет cindex Re: Программы для поиска файлов
Скажите, пожалуйста.
А есть ли какая то возможность, чтобы никс автоматом распаковывал все zip файлы, чтобы я вручную их не распаковывал?
Или как решить мою задачу?
зы
это парсинг госзакупок, мне там по всяким фильтрам надо искать, которых нет в паблике.
Спасибо сказали:
Аватара пользователя
Vascom
Сообщения: 1699
ОС: Fedora 32

Re: Поиск текста внутри zip

Сообщение Vascom »

Для автоматической распаковки можно написать скрипт.
Спасибо сказали:
azsx
Сообщения: 3684
ОС: calculate linux, debian, ubuntu

Re: Поиск текста внутри zip

Сообщение azsx »

Под всю эту задачу можно написать программу. Но хочется как нибудь попроще, так как задача отвественная, но не частая и смысла для написания чего то под неё не вижу.
Спасибо сказали:
Аватара пользователя
Vascom
Сообщения: 1699
ОС: Fedora 32

Re: Поиск текста внутри zip

Сообщение Vascom »

Напиши скрипт, отладь его и вперёд.
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu
Контактная информация:

Re: Поиск текста внутри zip

Сообщение serzh-z »

Vascom
Да есть же скрипт - zipgrep или типа того. Распаковывает в stdout и грепает.
Спасибо сказали:
azsx
Сообщения: 3684
ОС: calculate linux, debian, ubuntu

Re: Поиск текста внутри zip

Сообщение azsx »

grep будет достаточно долго искать по куче 66 тысячам файлов. Всё таки нужен индекс.
Спасибо сказали:
Аватара пользователя
Vascom
Сообщения: 1699
ОС: Fedora 32

Re: Поиск текста внутри zip

Сообщение Vascom »

Это нетривиальная задача. Проще самому написать нужный код.
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu
Контактная информация:

Re: Поиск текста внутри zip

Сообщение serzh-z »

azsx писал(а):
05.07.2018 12:58
Всё таки нужен индекс
Тогда Lucene/Solr или что-нибудь коммерческое на их основе, типа Elasticsearch. Хотя, для такого объема и обычного grep хватило бы. Либо Tracker, если бы к нему был готовый модуль распаковки.

А Windows ищет быстро, потому что у них есть Bing. Если бы в опенсорсе появилось подобное решение, то его тут же прибрали бы к рукам Google или тот же Microsoft.
Спасибо сказали:
azsx
Сообщения: 3684
ОС: calculate linux, debian, ubuntu

Re: Поиск текста внутри zip

Сообщение azsx »

нет, там сторонний софт. Как под виндой такую задачу решить штатныи средствами я тоже не знаю. Поиск занимает 1-3 секунды.
Спасибо сказали:
Аватара пользователя
Vascom
Сообщения: 1699
ОС: Fedora 32

Re: Поиск текста внутри zip

Сообщение Vascom »

Ну ты же понимаешь, что это не "поиск" в классическом понимании? Поскольку за 1-3 секунды взять с диска 20ГБ сжатых данных просто физически невозможно.
Спасибо сказали:
azsx
Сообщения: 3684
ОС: calculate linux, debian, ubuntu

Re: Поиск текста внутри zip

Сообщение azsx »

это поиск по индексу. Я же сказал в старт посте, программа cindex -- это то то мне нужно. Только надо чтобы в zip искала. Под виндой бывали программы, которые работали с zip как с обычными каталогами. Наверняка под никс тоже что нибудь такое есть на fuse. Я не прав?
Спасибо сказали:
Аватара пользователя
Vascom
Сообщения: 1699
ОС: Fedora 32

Re: Поиск текста внутри zip

Сообщение Vascom »

Ну так и ответ на первый пост проще некуда - распакуй скриптом все твои zip-файлы.
Спасибо сказали:
azsx
Сообщения: 3684
ОС: calculate linux, debian, ubuntu

Re: Поиск текста внутри zip

Сообщение azsx »

но ведь у меня постоянно обновления идут. То есть надо не скрипт на распаковку написать, а написать программу. Затраты на написание велики.
Спасибо сказали:
Аватара пользователя
Vascom
Сообщения: 1699
ОС: Fedora 32

Re: Поиск текста внутри zip

Сообщение Vascom »

Раз у тебя что-то специфичное, то не стоит ожидать, что это уже кто-то решил.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Поиск текста внутри zip

Сообщение Bizdelnick »

azsx писал(а):
05.07.2018 14:09
То есть надо не скрипт на распаковку написать, а написать программу.
Скрипт — это программа, так что противопоставление странное и неуместное.
azsx писал(а):
05.07.2018 14:09
но ведь у меня постоянно обновления идут.
azsx писал(а):
05.07.2018 14:09
Затраты на написание велики.
Если задача повторяется регулярно, затраты на её автоматизацию окупятся.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
azsx
Сообщения: 3684
ОС: calculate linux, debian, ubuntu

Re: Поиск текста внутри zip

Сообщение azsx »

Если задача повторяется регулярно, затраты на её автоматизацию окупятся.
к сожалению под винедой уже есть готовый софт. Лично для меня профит не очевиден. Я просто думал, что такое в никс есть. Я ошибся. Теперь я знаю, что вам подобный метод (из zip каталоги) неизвестен и есть большой шанс, что такого нет.
Спасибо сказали:
Аватара пользователя
Vascom
Сообщения: 1699
ОС: Fedora 32

Re: Поиск текста внутри zip

Сообщение Vascom »

Ты хочешь открывать zip как каталоги? С этого и надо было начинать в общем-то.
Можно использовать fuse-zip.
Спасибо сказали:
azsx
Сообщения: 3684
ОС: calculate linux, debian, ubuntu

Re: Поиск текста внутри zip

Сообщение azsx »

но он только каждый файл требует отдельно указывать.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Поиск текста внутри zip

Сообщение Bizdelnick »

Если Вы хотите индексатор, который умеет залезать внутрь архивов, то недавно помянутый в соседней теме recoll вроде бы должен это уметь:
It can process documents embedded inside other documents (for example a pdf document stored inside a Zip archive sent as an email attachment...), down to an arbitrary depth.
Zip archives need Python (and the standard zipfile module).
Да, я помню, что Вы его не осилили. Но тут на выбор: или осиливайте готовый инструмент, или пишите скрипт, или идите в винду, в которой якобы всё есть.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2
Контактная информация:

Re: Поиск текста внутри zip

Сообщение Hephaestus »

Xml с точки зрения хранения данных всё-таки весьма избыточен, помимо всего прочего.
Поэтому, если задача ответственная и при этом регулярная (хотя и не частая), возможно имеет смысл загнать всё это богатство в какую-нибудь БД. И размер будет меньше, и индекс будет, и всякие поиски/фильтры/отборы и прочие аналитики выполнять будет проще.

А рыскать по "сырым" xml-файлам - дело зряшное. В крайнем случае, можно натравить на них xslt-процессор, чтобы отбирал только критичные с точки зрения поиска элементы, выводил бы их в текстовый формат, и тогда уже grep'ать. Автоматизировать распаковку вместе с обработкой для кучи файлов можно в скрипте, как уже предлагали. Единственное - если файлы большие, штатный xslt-процессор может сдохнуть на первом же файле. Тогда нужен потоковый.
С учетом всего этого, вариант с БД всё-таки получше будет. Подумайте над этим. Сейчас у Вас 20Гб, через какое-то время будет 200Гб. Рулить всем этим на уровне файлов со временем будет всё труднее.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
azsx
Сообщения: 3684
ОС: calculate linux, debian, ubuntu

Re: Поиск текста внутри zip

Сообщение azsx »

Hephaestus по сути ваш ответ: надо писать программу и данные конвертировать в БД. Ответ я уже дал, но с вами я согласен.
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2
Контактная информация:

Re: Поиск текста внутри zip

Сообщение Hephaestus »

azsx писал(а):
06.07.2018 05:55
по сути ваш ответ: надо писать программу и данные конвертировать в БД
В целом, да.
Что, судя по Вашим словам, уже и сделано под оффтопик.

Проблема здесь вот в чем: xml - это даже не язык разметки. Это инструмент создания языков разметки.
То есть степеней свободы там достаточно много.

А что такое индекс поиска? Если позволите, чуть-чуть коснемся теории. Самую малость.
Spoiler
Допустим есть некая таблица. Большая. На пару миллионов строк и на пару сотен столбцов.
По всем правилам новые данные добавляются в конец таблицы. То есть данные неотсортированы. Это одно из условий нормализации, кстати.
Теперь ставим задачу поиска. Чтобы найти строку с конкретными данными придется просмотреть всю таблицу, так как нужная строка может оказаться в любом месте - в начале, в конце - где угодно.
Естественно, искать по отсортированным строкам проще - например, ищем на букву Б, если дошли до буквы В - дальше можно не искать, там уже точно нету. Таким образом, просматривается далеко не вся таблица.
То есть сортировка сильно облегчает задачу поиска.
Но сортировать таблицу на пару миллионов строк и пару сотен столбцов... Представляете, что это такое? Кучу данных много раз переставлять с места на место. И вот тут приходит на помощь индексация.
Индекс - это тоже такая таблица, только содержит она в простейшем случае не двести столбцов, а всего два: тот по которому ищем и ещё один с номером записи. Сортировать такую табличку, само собой, гораздо быстрее.
А дальше производим поиск: находим по индексной таблице нужную нам строку - это быстро, она отсортирована. Когда нашли, нам сразу же известен номер записи в основной таблице, и переходим в основной таблице к строке с этим номером. Всё. Нужная запись найдена. Примерно так, в общих чертах работает индекс.
Теперь допустим, что индекс нужно построить по именам файлов (примерно это делает locate).
Это опять-таки означает, что будет построена некая индексная таблица, в ней есть ключевое поле, по этому полю она отсортирована и по этому же полю происходит индексированный поиск.

А теперь представьте, что индекс нужно построить по содержимому файлов.
Здесь всё гораздо сложнее. Имя файла - это хоть и довольно длинная, но всё-таки строка, соответствующая определенным требованиям. А вот к содержимому файла такие требования отсутствуют, то есть оно может быть произвольным. Ну и как его индексировать? У меня хороших идей на эту тему нет. Я могу только предполагать, что индекс в этом случае строится только по определенным типам файлов (текстовым) и только определенным образом (например индексируются отдельные слова). Условно говоря, это значит, что можно искать по словам, но нельзя искать по отдельным буквам.

Возвращаемся к индексированному поиску по файлам xml.
Когда xml содержит повторяющиеся комбинации тегов, это соответствует табличному представлению данных.
Определенные теги обозначают границы строк, вложенные в них теги обозначают столбцы.
И при конвертации, скажем, в текст, получается текстовая таблица.
Но здесь есть различия.
В xml-файле теги "столбцов" могут повторяться внутри "строки". В таблице не может быть двух столбцов с одинаковыми именами (иначе как их программно различать?). Теги "столбцов" могут быть вложены друг в друга.
Столбцы в таблице не могут быть вложены друг в друга.
Тег "столбца" может отсутствовать в одной "строке" и присутствовать в другой.
В таблице столбец не может себя так вести - он проходит через все строки.
Таким образом, один xml-файл может содержать данные, которые не могут быть представлены в одной таблице, но могут быть представлены в нескольких связанных таблицах.
Отсюда вопрос: как это индексировать?
azsx писал(а):
05.07.2018 10:44
В винде для этого есть хорошая программа.
Вот эта программа индексирует xml? Или zip? Или вообще всё, что угодно?
Индексирует "по словам", или создает табличное представление или ещё как-то иначе?
Заточена ли она конкретно под эти xml-файлы и учитывает их структуру?
А может быть, она создает табличное представление без учета "вложенных друг в друга столбцов"?
А есть вообще уверенность, что эта программа нормально строит индекс и не упускает чего-то важного?
Если программа "фирменная", то наверно, всё делает, как надо.
Но в общем случае, это неизвестно.
А без ответов на эти вопросы невозможно найти оптимальное решение.
И любая программа, даже создающая какой-то индекс по этим файлам, будет "делать что-то не то".

Вывод: для правильного решения Вашей задачи, нужно изучить структуру файлов, однозначно выделить ключевые элементы (по которым искать) и только после этого думать про конкретную реализацию, индексы, grep и всё остальное.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
azsx
Сообщения: 3684
ОС: calculate linux, debian, ubuntu

Re: Поиск текста внутри zip

Сообщение azsx »

Hephaestus как то у вас всё слишком сложно!
А теперь представьте, что индекс нужно построить по содержимому файлов.
В своё время я индексировал html коды главных страниц, спарсил несколько десятков млн, парсинг был постоянным. Я воспользовался поиском в триграммах. Хотя поиск захватывал левые результы, но на самом деле можно n-грамы было добавлять, перепроверять выводимые результаты точным поиском и ваще по нормальным запросам всё выводил более менее точно.
---
Обсуждение про xml пропущу. Если вы для меня писали, так мне мало этого. Если вы для себя вслух думали, так о чём мне писать.
---

Код: Выделить всё

Вот эта программа индексирует xml? Или zip? Или вообще всё, что угодно?
Это аналог DocFetcher (который свободный) -- copernic (он не свободный и под винду).
DocFetcher ищет немного хуже (пропускает результаты поиска, я давно тестировал и знал ошибки его поиска, но имеет удобную возможность исключить каталог из поиска. То есть у меня 3 каталога, могу поискать в любом из них или во всех. Также он лучше работает с кодировками при предосмотре результатов. Для никса самое оно для поиска.
copernic имеет кучу не нужных мне возможностей, но главное, мою задачу поиск в постоянно меняющихся zip файлов последовательностей текста и удобный вывод их на предосмотр им решается на ура. DocFetcher так искать не мог.
Ответ -- нет copernic индексирует не чисто xml, а какую угодно последовательность текста учитывая форматы файлов, в том числе ищет часть слова на нескольких языках (триграммы короче).
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2
Контактная информация:

Re: Поиск текста внутри zip

Сообщение Hephaestus »

azsx писал(а):
07.07.2018 04:23
как то у вас всё слишком сложно!
На самом деле ничего сложного.
Букв много, но вывод простой: индексировать файлы нужно с учетом форматов.
Copernic вроде бы это и делает.
А индексировать xml-файлы желательно ещё и с учетом структуры. Которая бывает весьма развесистой.
И умеет ли конкретная программа это делать правильно - большой вопрос.

Если хотите результаты "как под виндой", то и решение нужно реализовывать "как под виндой".
Вам нравится copernic из-за возможностей поиска и всяких там предпросмотров.
И тут уж ничего не поделаешь: нужна программа, которая ищет как copernic и позволяет предпросмотры как copernic. Любая другая программа будет казаться ущербной.

А что касается индексов - индекс он и есть индекс. И правильно построить его невозможно без учета структуры данных. И я, например, сильно сомневаюсь, что тот же copernic, будучи универсальным инструментом корректно разберет любой xml-файл. С моей точки зрения, здесь нужно распаковывать архивы, анализировать структуру xml-файлов и уже исходя из этого строить схему поиска. В противном случае, можно использовать и grep, который будет zip-архив рассматривать как бинарный файл и вполне себе что-то там сможет искать. Только вот детальные результаты поиска в этом случае он не покажет. Просто скажет, что нашел. Вряд ли Вас это устроит.
Последний раз редактировалось Hephaestus 07.07.2018 11:36, всего редактировалось 1 раз.
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
azsx
Сообщения: 3684
ОС: calculate linux, debian, ubuntu

Re: Поиск текста внутри zip

Сообщение azsx »

результат всех обсуждений -- надо писать программу :)
Спасибо сказали:
Аватара пользователя
Hephaestus
Сообщения: 3729
Статус: Многоуважаемый джинн...
ОС: Slackware64-14.1/14.2
Контактная информация:

Re: Поиск текста внутри zip

Сообщение Hephaestus »

azsx писал(а):
07.07.2018 10:10
результат всех обсуждений -- надо писать программу
Угу. Ну или скрипт/набор скриптов на худой конец.
Нас - гентушников и слакварщиков написанием программ/скриптов не напугаешь, верно?
Пускай скрипят мои конечности.
Я - повелитель бесконечности...
Мой блог
Спасибо сказали:
azsx
Сообщения: 3684
ОС: calculate linux, debian, ubuntu

Re: Поиск текста внутри zip

Сообщение azsx »

Только в моём случае надо не написать программу, а переписать одну из функций другой, вполне работающей программы.
Вот впорос "зачем" меня останавливает.
Спасибо сказали:
Ответить