我最近用分区和数据恢复软件恢复了几个硬盘。大部分恢复的数据都是完整的,但在总共 3TB 的数据中,即使是一小部分损坏的文件,其数量也会非常大。
这些文件包括所有主要的文件格式:图像、视频/音频文件、Word 文档、PDF 等等,我现在面临的是浏览每个恢复的文件夹并手动打开每个文件以确定它是否已损坏。对于图像文件格式来说,这比较容易,因为没有缩略图就表明文件已损坏,但对于大多数其他格式,如音频和视频文件,需要打开并播放文件以确定没有损坏。出于显而易见的原因,我宁愿不这样做。
目前有哪些解决方案可以让我搜索损坏的文件并将其从恢复的硬盘中删除?
答案1
许多文件类型实际上相当复杂,本身就是一种微型文件系统。任何软件要想检测出健康/有效文件与损坏/无效文件,都需要详细了解其支持的每种文件类型。因此,对于一个支持 20 种文件类型的工具来说,就像编写一个文件恢复支持 20 个文件系统的工具。
现在,如果我们将目光集中到一种文件类型,例如 JPEG,编写一些代码来检查文件结构是否正常并不是什么难事。这有点像 chkdsk 查看文件系统的方式。Chkdsk 检查文件系统是否正常或一致,但它对实际数据一无所知。
要检查 JPEG 文件的实际数据,验证工具需要查看 JPEG 编码数据并确定其是否有效,或者需要查看实际图像并确定其是否看起来正常。
JPEG 可能会由于编码数据中的一位“翻转”而损坏,我在此处进行了演示:
这一位恰好扰乱了解码器,导致一半图像消失。这可以通过代码轻松检测到。但是,此图像将“渲染”得很好,因此更难检测到损坏:
如果我们考虑像 mp4 这样的文件类型,那么我们面对的是一个提供了很多“自由”的标准。核心组件是“原子”,常见的原子是 ftyp、mdat 和 moov,这些原子通常按此顺序出现。通常 mp4 以 ftyp 原子开头,所以我知道一些恢复工具可以通过验证它是否以 ftyp 原子开头来检查使用 MFT 检测到的 mp4 文件是否完整。现在这是一个非常简单的检查,主要会判断文件是否完整。
至少,这是理论,因为我遇到过以 mdat 原子开头的可播放 mp4 文件。
这给我们带来了文件验证的下一个问题:误报和漏报。因此,工具声称文件已损坏,但实际上并没有损坏,反之亦然。
综上所述,以下是一些可能的解决方案:
检查 JPEG:https://coderslagoon.com/#/product/badpeggy
检查视频:使用 ffmpeg 和批处理文件(我不能保证批处理文件,请自己制作):
u/echo off
set "filter=%1"
if [%filter%]==[] (set "filter=*.mp4")
for /R %%a in (%filter%) do call :doWork "%%a"
PAUSE
exit /B
:doWork
C:\ffmpeg\bin\ffmpeg.exe -v error -i %1 -f null - > "%~1.log" 2>&1
使用方法:
checkvideo.bat [filter]
,如果你不提供一个过滤器,将得到 '*.mp4'。例如:checkvideo.bat checkvideo.bat *.avi
您可能可以对 zip 文件使用类似的方法,请参阅:https://stackoverflow.com/q/3954505/15697799
但是对于您想要检查的几乎每种文件类型,您都需要找到一个可以尝试打开文件的应用程序,该应用程序可以进行批处理(接受命令行参数并可以记录错误)
答案2
目前有哪些解决方案可以让我搜索损坏的文件并将其从恢复的硬盘中删除?
没有任何。
部分原因是“所有主要格式”并不是一个明确定义的列表。
您可以列出您感兴趣的格式,并为每种格式确定一个检查它的命令。该命令可能是转换为另一种格式,输出为空文件或随后被删除的文件。然后编写一个脚本,将适当的命令应用于所有文件,检测故障并删除或分离故障文件。