我收到一个装满旧数据 CD 的手提箱,里面装满了需要保存的图像。但是,这些图像中很可能有很多已经保存在文件系统中,但我不知道在哪里(系统已经包含大约 170000 张图片),而且它们可能以不同的名称保存。那么有没有一种方法可以轻松检查包含此二进制数据的图像(exif 可能不同,因为我不知道这些图片之前是如何保存的,这些 CD 已经有 20 年的历史了)是否已经存在于文件系统中?
我使用的是 Arch Linux。如果需要,也可以编写一些代码,但如果需要,代码应该是快速的,因为它必须运行很多次。最好从命令行运行解决方案。
任何帮助都将不胜感激,如果需要澄清,我很乐意回复评论。如果我忘记了任何重要信息,请告诉我,我是新来的。
编辑:我可以将要检查的文件数量从 170000 个缩小到 20000-30000 个,因为有些文件夹肯定不包含想要的图像。如果这有帮助的话,这是可能的。
答案1
类似的东西可以检查现有文件并生成sha1
:
find <path to image root> -type f -exec sha1sum {} \; 2>/dev/null|awk '{gsub(/^.*\//,"",$2); print $1,$2}' >/tmp/sums1
上述命令find
文件从定义的目录开始,并sha1sum
针对每个发现执行。STDERR 被重定向到/dev/null
以避免出现“您没有权限……”之类的消息。输出被重定向到从开头到斜线()替换的awk
位置。这是为了从输出中删除路径并仅保留文件名。否则,您将获得路径,并且第二次执行可能找不到路径中的文件。打印标记 1 和 2。并且重定向到某个文件。gsub
/
find
sha1sum
awk
然后进入 CD 目录并
sha1sum -c /tmp/sums1 2>/dev/null|grep -v "OK$"
检查是否存在与现有文件具有相同校验和的文件。这将仅在当前目录中搜索图像和总和。
您还可以在图像位置和 CD 上生成校验和、合并校验和文件、排序和删除不等效的连续记录。
答案2
所以,我终于让它工作了。这里借鉴了另一个答案。该答案中的第一个命令生成所需的文件,其中包含文件系统中已有的所有文件的所有校验和。但第二个命令仍然没有返回可用的输出,这就是为什么我编写了一个 bash 脚本来帮我完成这项工作。可能有一种方法可以更优雅地做到这一点,但这对我来说有效。
再次感谢
#!/bin/bash
shopt -s globstar
for filename in **/*; do
if [ -f "$filename" ]; then
calculated_checksum=$(sha1sum -- "$filename" | awk '{print $1}')
if ! grep -q "$calculated_checksum" /tmp/sums1; then
echo "$filename has to be copied"
else
echo "Match: $filename"
fi
fi
done