检查文件是否存在

检查文件是否存在

我有一个包含数千张(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/searchimage-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

该输出仍然显示相同的extramissing行,以及许多 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 哈希值一次并且仅适用于无法区分大小的文件。

当然,这假设现有文件或新文件中没有重复项(但也可以轻松调整以检查这一点)。

相关内容