У меня есть папка с подпапками в ней и много документов libreoffice (.odt).
Мне нужно найти, в какой из них есть конкретная фраза.
Я попытался grep -ir "search phrase here" .
, но он нашел только поисковую фразу в файле XML.
Есть ли способ поиска в документах, которые не являются текстовыми файлами?
Наконец я решил использовать Recoll. Это делает хорошую работу по поиску информации в файлах. Однако индексация идет медленно и требует много ресурсов. Это не проблема, если вы не запускаете Recoll как демон, а обновляете индекс только вручную, когда не используете компьютер.
У меня аналогичная проблема с файлами OpenDocument (документ ODT, шаблон OTT) и Microsoft Word (документы DOC и DOCX, шаблоны DOT и DOTX).
В настоящее время мне нравится следующий сценарий Bash для рекурсивного поиска:
#!/bin/sh
if [ "$#" -ne 1 ]; then
echo "Usage: `basename $0` search_pattern"
echo "You should have installed the following packages: odt2txt, docx2txt and libreoffice-writer"
exit 1
fi
search_pattern="$1"
echo "Looking for: $search_pattern\n"
find -name '*.odt' -o -name '*.ott' -o \
-name '*.docx' -o -name '*.dotx' -o \
-name '*.doc' -o -name '*.dot' \
-type f | while read doc; do
doc_fullfilename=$(basename -- "$doc")
doc_filename="${doc_fullfilename%.*}"
doc_filetype="${doc_fullfilename##*.}"
case $doc_filetype in
'odt' | 'ott')
(odt2txt "$doc" 2>/dev/null | grep -i "$search_pattern") && echo "^ found in ODT/OTT: $doc" && echo
;;
'docx' | 'dotx')
(docx2txt "$doc" - 2>/dev/null | grep -i "$search_pattern") && echo "^ found in DOCX/DOTX: $doc" && echo
;;
'doc'| 'dot')
out_dir=/tmp
lowriter --headless --convert-to txt:Text "$doc" --outdir "$out_dir" 2>&1 > /dev/null
grep -i "$search_pattern" "$out_dir/$doc_filename.txt" && echo "^ found in DOC/DOT: $doc" && echo
;;
esac
: ; done
Он показывает результаты поиска и имена файлов.
Примечания:
odt2txt
(для ODT / OTT), docx2txt
(для DOCX / DOTX), libreoffice-writer
(для DOC / DOT).