Answers:
Word doc
文件实际上是经过压缩的,然后放入了容器格式。他们以这种编译文件格式将媒体存储在某个位置,可能就在doc
格式标题之后。在图像数据之后,您的真实文档是一个与zip兼容的文件夹。
因此,当您尝试解压缩doc
文件时,开头会得到过多的字节。这些是您的图像(加上格式标题)。现在,您可以尝试读取unzip
文件并检查多余的字节数。
charon:test werner$ unzip -c images.doc > /dev/null
warning [images.doc]: 47166 extra bytes at beginning or within zipfile
charon:test werner$ unzip -c noimages.doc > /dev/null
warning [noimages2.doc]: 6060 extra bytes at beginning or within zipfile
通过测试,我发现“纯文本” Word文档的标题大6060字节(尽管有些大一些)。我们可以尝试利用它来确定文档中是否有图像。我们只能说8000个字节-因为实际图像肯定会超过几个KB。
使用Office 2007格式(docx
),这要容易得多。这些是实际的压缩文件,任何包含任何类型的嵌入式媒体(图像,视频)的Word文件都将包含file.docx/word/media
目录。因此,我们只需要解压缩docx
文件并检查该目录是否存在。
创建一个新的空文件,将其命名为docx-images.rb
,然后粘贴以下内容:
#!/usr/bin/env ruby
require 'open3'
TEMPDIR = "/tmp/word/"
# check for docx files
Dir.glob("**/*.docx").each do |file|
system("rm -rf '#{TEMPDIR}'")
system("unzip '#{file}' -d #{TEMPDIR} > /dev/null")
if File.directory?("#{TEMPDIR}/word/media/")
puts file
end
end
# check for doc files
Dir.glob("**/*.doc").each do |file|
stdin, stdout, stderr = Open3.popen3("unzip -c '#{file}' > /dev/null")
info = stderr.readlines[0]
info = info.gsub(" extra bytes at beginning or within zipfile", "").gsub(/warning\s\[.*\]:\s+/, "")
if info.to_i > 8000 # assume a little more than usual header size
puts file
end
end
将其保存在某个位置,最好保存在您要开始搜索docx
文件的Documents
文件夹中,也许是文件夹中。
现在,打开Terminal.app,然后使用cd ~/Documents
它去那里。
输入ruby docx-images.rb
,它将递归地扫描您的Documents
文件夹中的docx
和doc
文件。它将前者解压缩到/tmp/word
,并检查它们是否包含嵌入式媒体。后者只是解压缩到/dev/null
,因此没有任何痕迹。
最后,您将获得包含嵌入式媒体的列表。
为了证明这可行,我创建了四个文件。一个带有图像,一个没有图像– as doc
和docx
:
然后,运行脚本:
charon:test werner$ ruby docx-images.rb
images.docx
images.doc
显然,可以对该脚本进行改进以检查该media
文件夹中的实际图像,但是除非该文件确实包含任何媒体,否则它不太可能存在。“ 6060”字节检查也是如此。这是一个技巧,但对我有用。
当然,该脚本取决于unzip
各自系统上的实现,但是它适用于OS X版本。
.doc
文件的列表,而不只是带有图像的文件的列表?您是否可以unzip -c some-file.doc > /dev/null
针对这些错误分类的文件之一运行,并告诉我是否还有6060字节以外的偏移量?
Simons-MacBook-Pro:7000-Acts and the Early church Simon$ unzip -c 7000-TROAS.doc > /dev/null End-of-central-directory signature not found. Either this file is not a zipfile, or it constitutes one disk of a multi-part archive. In the latter case the central directory and zipfile comment will be found on the last disk(s) of this archive. note: 7000-TROAS.doc may be a plain executable, not an archive unzip: cannot find zipfile directory in one of 7000-TROAS.doc or 7000-TROAS.doc.zip, and cannot find 7000-TROAS.doc.ZIP, period.