有没有办法做到这一点,特别是在一个目录中的一组多个 epub/mobi 文件上?
答案1
您可以通过提供-a
将文件解释为 ascii 的选项来轻松 grep 这些文件:
grep -a "author" *.epub *.mobi
上述方法适用于我所有 1000 多个 EPUB 和 MOBI 文件,给出了预期的结果。
EPUB 和 MOBI 都是容器格式。 EPUB本质上是一个.zip
有一些结构要求的文件,MOBI是一个Palm数据库格式文件。两种格式都允许将压缩或未压缩的数据放入容器中。
如果您要查找的数据位于容器内的“文件”中,并且该文件已压缩,您将需要提供压缩字符串不是字符串的扩展、未压缩版本。特别是,如果您在电子书阅读器上阅读 EPUB/MOBI,您通常不会grep -a 'abcde'
在所有 EPUB 和 MOBI 文件上使用您刚刚阅读的单词“abcde”,因为这本书的内容很可能(但不一定,这只是容器中压缩“文件”中的一种效率措施。
这不是grep
无法在这些文件中搜索的问题,而是你未提供正确的搜索字符串。如果您使用某些日语到英语翻译软件读取包含日语文本的文件,然后希望能找到该文件,也会发生同样的情况英语单词通过 grep 原始文件。有了-a
正确的日语(二进制)单词模式,grep
就可以很好地工作。
答案2
这适用于 windows7+cygwin;搜索 zip 档案内的文本。
c:\> zipgrep "regex" file.epub
shell 脚本位于 c:/cygwin/bin/zipgrep 中,这也有效:
c:\> unzip -p "*.epub" | grep -a --color regex
-p 用于管道。
grep-epub.sh 脚本
PAT=${1:?"Usage: grep-epub PAT *.epub files to grep"}
shift
: ${1:?"Need epub files to grep"}
for i in $* ;do
echo $0 $i
unzip -p $i "*.htm*" "*.xml" "*.opf" | # unzip only html and content files to stdin
perl -lpe 's![<][^>]{1,200}?[>]!!g;' | # get rid of small html <b>tags
grep -Pinaso ".{0,60}$PAT.{0,60}" | # keep some context around matches
grep -Pi --color "$PAT" # color the matches.
done
答案3
epub 格式是压缩的二进制文件,因此在尝试解析文本之前必须将其解压缩。 MOBI 格式似乎也不是纯文本,所以,不,我想说 epub 和 mobi 文件不能被 grep,因为它们不是纯文本文件。使用 calibre 或其他允许文件内搜索的阅读器。
答案4
人们可以将以前的答案与 find 结合起来:
find . -name "*.epub" -exec zipgrep pattern {} \;
这样一来,人们就可以在目录树中进行搜索,从而无需所有文件都位于同一目录级别。