我有一个包含数千张(70G)图像的文件夹folder/to/check/
,对于每个文件,我想检查它是否已经存在于另一个包含数千张图像(414G folder/to/search/
)的目录中。
这是我提出的脚本,但它需要很长时间才能运行,所以我认为可以优化任务。
find folder/to/check/ -type f -exec md5sum {} + | awk -F" " '{ print $1,$2 }' | while read -r p1 p2; do find folder/to/search/ -type f -exec md5sum {} + | grep "^$p1" && echo "Found: $p1 $p2" || echo "Not found: $p1 $p2"; done > out.txt
有谁知道如何优化脚本吗?或者可以给我指出正确的方向吗?不过我的技能很基础。
答案1
做这个。
计算“待检查”文件夹中每幅图像的 md5 值,并将其写入文本文件。
计算“to-search”文件夹中每个图像的 md5 总和,并将其附加到第一个文件。
将这个巨型文件排序为一个新文件。
使用类似的方法
uniq -c
来计算每行重复的次数。
如果我理解正确了你的命令(也可能不正确),我认为现在你md5sum
总共执行了 X * Y 次,但是通过上述操作,可以减少到 X + Y 次。
答案2
mtree
当您需要比较两个文件层次结构以查找相同/不同的时间戳或相同/不同的 MD5/SHA256 哈希值时,它是一个方便的实用程序。
让我们建立一个简单的测试层次结构:
$ mkdir -p folder/to/check
$ mkdir -p folder/to/search
$ for N in $(jot -w %03d 10); do touch `/image-$N.jpg; done
$ for N in $(jot -w %03d 10 2); do touch folder/to/search/image-$N.jpg; done
folder/to/check
有文件image-001
到-010
,而folder/to/search
有image-002
文件到-011
。所有文件都是相同的(零字节长度),但具有不同的时间戳。
如果你仅有的想要检查 MD5 哈希值(以及每个文件的存在/不存在),那么:
$ mtree -kmd5 -cp folder/to/check | mtree -p folder/to/search
extra: image-011.jpg
./image-001.jpg missing
该extra
行表示image-011.jpg
存在于folder/to/search
但不需要存在(因为它不在 中folder/to/check
),并且该missing
行表示image-001.jpg
在源文件夹(folder/to/check
)中找到了 但在目标文件夹(folder/to/search
)中没有找到。
如果您除了想要检查 MD5 哈希值之外还想要检查时间戳,那么:
$ mtree -Kmd5 -cp folder/to/check | mtree -p folder/to/search
.: modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-010.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-008.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-006.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
extra: image-011.jpg
image-007.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-009.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-004.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-003.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-002.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-005.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
./image-001.jpg missing
该输出仍然显示相同的extra
和missing
行,以及许多 MD5 哈希值相同但时间戳不同的文件。最后,如果任何文件的 MD5 哈希值与其对应文件不同,mtree
将告诉您哪些文件:
$ date > folder/to/search/image-007.jpg
$ mtree -Kmd5 -cp folder/to/check | mtree -p folder/to/search
.: modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-010.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-008.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-006.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
extra: image-011.jpg
image-007.jpg:
size (0, 29)
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:25:05 2019)
md5digest (0xd41d8cd98f00b204e9800998ecf8427e, 0x6fd624d18a8fe0c096b19ff858a2acf7)
image-009.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-004.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-003.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-002.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
image-005.jpg:
modification time (Mon Sep 30 16:16:15 2019, Mon Sep 30 16:16:24 2019)
./image-001.jpg missing
答案3
有一些实用程序可以做到这一点,但是如果你想自己做:
- 获取所有文件的字节大小,并列出所有具有完全相同大小的文件。
- 对于包含多个元素的列表(不是很多,特别是在大文件中):
- 计算列表中所有元素的 MD5
- 检查重复项
本质上,这会让你计算 MD5 哈希值一次并且仅适用于无法区分大小的文件。
当然,这假设现有文件或新文件中没有重复项(但也可以轻松调整以检查这一点)。