在对一个在 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
。
最后,您可以通过管道cut
将sed
其单独打印匹配文件的名称:
$ 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' \;
我尝试了这种方法,但怀疑有损坏的文件夹子集没有,我将结果保存到文件中。手动检查每个文件后,我非常高兴这种方法可靠。