Инструмент командной строки для поиска файлов docx

Вопрос или проблема

Существует ли инструмент командной строки для текстового поиска в файле docx? Я пробовал использовать grep, но он не работает с docx, хотя отлично работает с txt и xml файлами. Я мог бы сначала конвертировать docx в txt, но предпочел бы инструмент, работающий непосредственно с docx файлами. Мне нужно, чтобы этот инструмент работал в Cygwin.

Редактирование ОР: Позже я обнаружил, что самый простой способ выполнить grep – это на самом деле конвертировать эти docx в txt, а затем использовать grep по ним.

Мое решение с grep в виде функции, которую можно вставить в ваш .bashrc

docx_search(){ local arg wordfile terms=() root=${root:-/}; for arg; do terms+=(-e "$arg"); done; find 2>/dev/null "${root%/}/" -iname '*.docx' -exec bash -c "$(declare -p terms)"'; for arg; do unzip -p "$arg" 2>/dev/null | grep --quiet --ignore-case --fixed-strings "${terms[@]}" && printf %s\\n "$arg"; done' _ {} +; }

Она будет искать любое (с учетом регистра) вхождение своих аргументов и выводить местоположение соответствующего файла docx.


Примеры:

$ docx_search 'my example sentence'
/cygdrive/d/example sentences.docx
/cygdrive/c/Users/my user/Documents/example sentences.docx
$ root="/cygdrive/c/Users/my user/" docx_search 'seldom' 'full sentence'
/cygdrive/c/Users/my user/Documents/example sentences.docx
$ 

Читаемая версия:

docx_search(){
  local arg wordfile terms=() root=${root:-/}
  # это присваивание ‘root’ позволяет искать в конкретном месте, например, /cygdrive/c/ вместо поиска везде на машине
  for arg; do terms+=(-e "$arg"); done
  # Мы внедряем термины для поиска внутри строки с помощью declare -p
  find 2>/dev/null "${root%/}/" -iname '*.docx' -exec \
    bash -c "$(declare -p terms)"';
      for arg; do
        unzip -p "$arg" 2>/dev/null |
          grep --quiet --ignore-case --fixed-strings "${terms[@]}" &&
          printf %s\\n "$arg"
      done' _ {} +
}

Я знаю несколько инструментов индексирования, поддерживающих документы Word. Такие инструменты позволяют индексировать документы, а затем эффективно искать слова в индексе. Они не позволяют выполнять полные текстовые поиски.

DOCx сжат и не является текстовым форматом. Таким образом, вам сначала нужен конвертер. После этого можно использовать команду find на преобразованных файлах.

Вот обновленная версия, оптимизированная для производительности.

Требуются ripgrep и fd-find. Вот как их установить, если они у вас не установлены.

fd-find:

sudo apt install fd-find

ripgrep:

curl -LO https://github.com/BurntSushi/ripgrep/releases/download/13.0.0/ripgrep_13.0.0_amd64.deb
sudo apt install ./ripgrep_13.0.0_amd64.deb

Вставьте это в ваш .bashrc:


docxgrep() {

    keyword="$1"

    /usr/bin/fdfind -t f -e docx . | while read -r arg; do
        if unzip -p "$arg" 2>/dev/null | rg -q  --ignore-case --fixed-strings "$keyword"; then
            echo "$arg"
        fi
    done
}

Запустите source ~/.bashrc
Теперь мы можем искать:

$ docxgrep 'hello'        
./Document.docx

Вы смотрели openoffice ninja?
(не знаю о поддержке cygwin)

Существует специализированная версия grep для поиска в *.docx (и других документах Microsoft Office), *.pdf, *.mp3, базах данных (SQLServer, Oracle, PostgreSQL, MySQL, SQLLite, H2), метаданных изображений (*.jpg, *.bmp, *.png, *.gif, *.tiff), Maven, сжатых файлах (*.zip, *.tar.gz, *.7z и т.д.) и других файлах. Заявлено, что она выполняет рекурсивные поиски ресурсов внутри ресурсов. Требуется предварительная установка Java.

Отзывы от:

(2022) https://darrengoossens.wordpress.com/2022/09/04/crgrep-in-2022-grep-any-file-windows/

(2017) https://darrengoossens.wordpress.com/2017/07/28/search-insde-word-pdf-xml-and-other-files-installing-and-using-crgrep/

Еще одна возможность – docread, написанная на rust:
https://github.com/agoldhammer/docread

.

Ответ или решение

Для поиска текста в файлах формата DOCX с использованием командной строки под Cygwin существует несколько вариантов, включая кастомные скрипты и специализированные утилиты. Формат DOCX — это сжатые ZIP-файлы, содержащие XML-документы, поэтому работа с ними требует специфического подхода.

Решения для поиска текста в DOCX:

1. Использование bash-сценария

Встроенный bash-скрипт, который можно добавить в файл .bashrc, позволяет осуществлять поиск по DOCX-файлам. В основе метода лежит использование утилиты unzip для распаковки файлов и последующий поиск командой grep.

Пример функции:

docx_search(){
    local arg wordfile terms=() root=${root:-/}
    for arg; do terms+=(-e "$arg"); done
    find 2>/dev/null "${root%/}/" -iname '*.docx' -exec \
    bash -c "$(declare -p terms)"';
      for arg; do
        unzip -p "$arg" 2>/dev/null |
          grep --quiet --ignore-case --fixed-strings "${terms[@]}" &&
          printf %s\\n "$arg"
      done' _ {} +
}

2. Использование ripgrep и fd-find

Для повышения эффективности можно использовать инструменты ripgrep и fd-find, которые известны своей скоростью. Их необходимо предварительно установить.

Шаги установки:

sudo apt install fd-find

Установка ripgrep:

curl -LO https://github.com/BurntSushi/ripgrep/releases/download/13.0.0/ripgrep_13.0.0_amd64.deb
sudo apt install ./ripgrep_13.0.0_amd64.deb

Функция для поиска:

docxgrep() {
    keyword="$1"
    /usr/bin/fdfind -t f -e docx . | while read -r arg; do
        if unzip -p "$arg" 2>/dev/null | rg -q  --ignore-case --fixed-strings "$keyword"; then
            echo "$arg"
        fi
    done
}

3. Специализированные инструменты

  1. crgrep — универсальная утилита для поиска, которая поддерживает DOCX, PDF, базы данных и многие другие форматы. Требует установки Java.
  2. Recoll или Lucene — мощные индексационные системы, которые можно адаптировать для работы с DOCX через конвертеры.

4. Конвертация DOCX в текст

Если перечисленные методы кажутся сложными, возможно конвертировать DOCX в текстовые файлы с помощью docx2txt и затем применять традиционный grep.

Заключение

Каждое из предложенных решений имеет свои преимущества и ограничения. Выбор зависит от специфики задачи, требований к скорости и простоте реализации. Надеюсь, предоставленные методы помогут вам найти оптимальное решение для поиска внутри DOCX файлов под Cygwin.

Оцените материал
Добавить комментарий

Капча загружается...