10.04.2012

Поиск в консоли в текстовых документах по содержимому

Иногда нужно найти нужный файл по содержимому, созданный в текстовых процессорах MS Word, OpenOffice Writer, LibreOffice Writer. 
Команды locate, grep, find в отдельности не дадут результата, так как файлы, созданные в текстовых процессорах ими напрямую не могут быть прочитаны с декодированием.
Но выход есть.
Поиск по документам MS Word начиная с текущего каталога используя утилиту catdoc для чтения doc файлов
find . -name "*.doc" | while read i; do catdoc "$i" | grep -H --label="$i" -n "Искомая фраза"; done
или, используя утилиту antiword для чтения doc файлов
find . -name "*.doc" | while read i; do antiword "$i" | grep -H --label="$i" -n "Искомая фраза"; done
Поиск по документам OpenOffice Writer и LibreOffice Writer начиная с текущего каталога используя утилиту odt2txt для чтения odt файлов
find . -name "*.odt" | while read i; do odt2txt "$i" | grep -H --label="$i" -n "Искомая фраза"; done
Поиск по текстовым PDF файлам (не будет работать с файлами созданными из графических форматов, например отсканированные книни без текстового слоя):
find . -name '*.pdf' -exec pdftotext {} - \; | grep "Искомая фраза"
После работы однострочника выдается путь к файлу и номер строки с искомой фразой.
Прочитать документ можно так:
antiword "имя файла" | less
odt2txt "имя файла" | less
в less по "/" работает поиск.

6 комментариев:

  1. по pdf можно искать только если он текстовый, добавил для pdf

    ОтветитьУдалить
  2. Анонимный11.04.2012, 23:27

    find . -name "*.doc" | while read i; do antiword "$i" | grep -H --label="$i" -n "Искомая фраза"; done - это работает
    а это find . -name "*.doc" | while read i; do catdoc "$i" | grep -H --label="$i" -n "Искомая фраза"; done не работает. Почему?

    ОтветитьУдалить
    Ответы
    1. у меня оба варианта работает
      catdoc стоит?

      Удалить
  3. Анонимный02.12.2012, 12:36

    спасибо. по файлам *.doc antiword выводит больше символов в строке, чем catdoc - для меня это критично, поскольку важная инфа находится иммено в конце строки.
    но есть одна проблема - вывод найденных строк получается хаотичным. Как упорядочть вывод строк по имени файлов? Мне нужно брать инфу со строки в последнем по имени файле, и приходится всматриваться в названия, отыскивать последнее имя - есть шанс ошибки ((

    ОтветитьУдалить
  4. Анонимный02.12.2012, 12:58

    нашел))
    find . -name "*.doc" | sort | while read i; do antiword "$i" | grep -H --label="$i" -n "Искомая фраза"; done

    ОтветитьУдалить
  5. Блин ребята, неужели это в гуй нельзя было загнать для удобства?! :)

    ОтветитьУдалить