我有一个文件夹,里面有子文件夹和许多 libreoffice 文档 (.odt)。
我需要找出哪一个里面有一个特定的短语。
我试过了grep -ir "search phrase here" .
,但它只在 xml 文件中找到搜索短语。
有没有办法在非纯文本文件的文档中进行搜索?
答案1
答案2
我对 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"
printf "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 -r 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)。 - 理论上,所有这些程序都可以更改为只有一个 - LibreOffice Writer,但它对于 ODT/OTT 和 DOCX/DOTX 来说速度明显较慢。