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