检查一个文件夹中的所有文件是否也在另一个文件夹中

Uro*_*327 6 bash duplicate diff

我基本上有一个a包含大量图像的目录。现在我想检查所有这些图像是否都在目录中b。关键是,很多图像b不是直接b在子目录中,而是在子目录中。

另外我不想依赖文件名,而是依赖文件内容。

(因为 bash 标签:我更喜欢 bash 答案,但如果是其他语言或者使用其他程序,也可以)

Min*_*nix 5

由于您想按内容比较它们,因此使用哈希似乎是一种方法。

您可以使用该find命令获取目录的文件路径列表。该-type f选项将忽略所有目录,仅输出常规文件的路径。该-exec md5sum {} \;选项将获取找到的路径并将它们提供给md5sum命令以转换为列表 md5 哈希 + 它们的文件路径('md5_hash /path/to/file')。

我们将该列表通过管道传输到cut命令中。第一个选项-f 1告诉它仅采用第一列(哈希值)。第二个-d ' '告诉它使用空格字符作为列之间的分隔符。默认为 TAB。

我们将该哈希列表通过管道传输到排序命令中,以使其更容易diff

<( command )运算符称为Process Substitution。它获取命令的输出并将其转换为需要它们作为输入的命令的伪文件(有关不太简单的解释,请点击链接)。这样,看起来diff就像我们想要比较两个文件一样。

:~$ diff <(find folder1/ -type f -exec md5sum {} \; | cut -f 1 -d ' ' | sort) \
    <(find folder2/ -type f -exec md5sum {} \; | cut -f 1 -d ' ' | sort)
Run Code Online (Sandbox Code Playgroud)

注意:不要忘记将folder1/ 和folder2/ 替换为您的实际文件夹。

这将为您提供仅存在于其中一个文件中的文件的 md5 哈希值列表。

如果您想知道哪些文件实际上丢失了,您可以执行以下操作:

:~$ find folder1/ -type f -exec md5sum {} \; | sort | grep my_md5_hash
Run Code Online (Sandbox Code Playgroud)

如果您有很多文件要检查,明智的做法是保存两个<(find ...)命令的结果并进行比较,如下所示:

:~$ diff list1.txt list2.txt
:~$ cat list1.txt | grep my_md5_hash
Run Code Online (Sandbox Code Playgroud)