如何在 Linux 上查找并删除损坏的文件?

如何在 Linux 上查找并删除损坏的文件?

看来我的一个 Btrfs 驱动器有文件损坏。我将所有能够复制的文件复制到另一个驱动器,然后重新格式化 Btrfs 驱动器。

大多数文件似乎没问题,但有些文件明显损坏,即无法打开。这些文件大多是视频和音频文件,我有数千个。

有没有办法只列出损坏的文件并从文件夹中移除/删除它们?我有大约 250 GB 的文件,所以我无法手动完成。我只是试图尽可能多地保存,但我需要放弃那些坏的文件。

谢谢

答案1

PhotoRec 可能对你有用:

https://www.cgsecurity.org/wiki/PhotoRec

https://www.cgsecurity.org/wiki/TestDisk

关于音频文件,我会这样做:安装 mplayer(如果您还没有安装)。它可以播放大多数 A/V 格式。如果文件损坏,尝试播放它将产生退出代码 > 0。

一个示例(快速而粗糙的)方法:

  1. 运行下面的单行命令(示例针对的是.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 仅播放每个文件的一点点。

  2. 运行上一步生成的check.sh:

    sh ./check.sh
    
  3. 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……)的完整性?

相关内容