看来我的一个 Btrfs 驱动器有文件损坏。我将所有能够复制的文件复制到另一个驱动器,然后重新格式化 Btrfs 驱动器。
大多数文件似乎没问题,但有些文件明显损坏,即无法打开。这些文件大多是视频和音频文件,我有数千个。
有没有办法只列出损坏的文件并从文件夹中移除/删除它们?我有大约 250 GB 的文件,所以我无法手动完成。我只是试图尽可能多地保存,但我需要放弃那些坏的文件。
谢谢
答案1
PhotoRec 可能对你有用:
https://www.cgsecurity.org/wiki/PhotoRec
https://www.cgsecurity.org/wiki/TestDisk
关于音频文件,我会这样做:安装 mplayer(如果您还没有安装)。它可以播放大多数 A/V 格式。如果文件损坏,尝试播放它将产生退出代码 > 0。
一个示例(快速而粗糙的)方法:
运行下面的单行命令(示例针对的是.mp3,如果需要,您可以轻松修改为.wav 或其他格式。)
find <your_recovery_drive_mount_point> -iname '*.mp3' | while read f; do echo "mplayer -frames 20 ${f} || echo ${f} >> bad.lst" >> check.sh ; done
我用了-帧 20选项以便让 mplayer 仅播放每个文件的一点点。
运行上一步生成的check.sh:
sh ./check.sh
bad.lst 中会有一个“不可播放”文件的列表。你可以用另一行命令来处理它们:
cat bad.lst | while read f; do mv "${f}" /path/to/wastebin ; done or cat bad.lst | while read f; do rm "${f}"; done
祝你好运!
附录/勘误表
第 1 点中的单行代码的修正版本可以处理复杂的文件名,如下所示:
find <your_recovery_drive_mount_point> -iname '*.mp3' | while read f; do echo "mplayer -ss 10 -endpos 1 '${f}' | grep -iq failed && echo '${f}' >> bad.lst" >> check.sh ; done
仍然存在限制:仅当文件头损坏时,mplayer 才会检测到文件不可读。如果文件头正常,但例如文件被截断 - mplayer 无法检测到这种情况。对于视频文件,也许 ffmpeg 会是一个更好的工具 - 请参阅此线程: 如何检查视频文件(avi、mpeg、mp4……)的完整性?