在 Debian/Ubuntu 中查找长度大于 0 字节且仅由 NUL 组成的文件

在 Debian/Ubuntu 中查找长度大于 0 字节且仅由 NUL 组成的文件

在对一个在 QNAP nas 中运行了大约四年而没有进行 fsck 的 ext4 驱动器进行 fsck 之后,我现在有许多文件看起来大小正确(通常为 8-12mib),但它们内容的每个字节都是 null/NUL/00(即,在十六进制编辑器中看到时,0 一遍又一遍重复)。

我已经使用“hexedit”工具检查了这一点,并使用“od”对各种长度的字节进行了采样

与其在 10,000 多个 NEF 和 JPEG 图像文件中进行搜索,有没有办法可以自动搜索这些文件并将它们写入列表 - 以便我可以从备份中恢复它们?

答案1

假设您的文件仅包含空字符串(没有换行符\n),您可以使用grep和 find 来找到这些文件。

find 命令将收集当前目录中所有大小至少为 1 字节(-size +1c)的文件,然后使用 grep 检查它们是否包含仅有的NULL 字符的重复:

$ find . -type f -size +1c -exec grep -m 1 -ovP "[^\0]" {} \; 
Binary file ./empty_file with spaces.jpg matches
Binary file ./empty_file matches

grep 的标志-v使其打印不匹配的行。1-m表示“在第一个匹配后停止”,-o表示仅打印匹配的行部分(避免打印来自其他文件的空行)并P使用 Perl 正则表达式。模式[^\0], 表示任何非NULL字符。通过反转此 ( -v) 并添加-m 1标志,grep 将报告匹配仅有的如果文件仅包含NULL

最后,您可以通过管道cutsed其单独打印匹配文件的名称:

$ find . -type f -size +1c -exec grep -m 1 -ovP "[^\0]" {} \; | cut -d ' ' -f 3- | sed 's/ matches//'
./empty_file with spaces.jpg
./empty_file

答案2

尽管上述答案在检查文件方面更加彻底(并且不那么复杂),但还是拼凑了以下内容。有一些额外的命令只是为了处理 NAS 处理文件名的奇怪方式,但它使用“od”来获取文件的前 32 个字节(我的理由是,如果前 32 个字节为空,那么其余的字节也可能为空,尤其是对于图像而言):

find "$(pwd)" -type f -exec sh -c 'file=$(echo "{}" | sed "s/([\(\)])/\\\1/g"); check=$(od -N32 -w32 -x "$file"); if echo $check | grep --quiet " 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000"; then echo "$file" $check; fi' \;

我尝试了这种方法,但怀疑有损坏的文件夹子集没有,我将结果保存到文件中。手动检查每个文件后,我非常高兴这种方法可靠。

相关内容