在目录中递归查找和计数文件的最快方法

问题描述

我正在构建一个小程序来比较两个目录的文件内容。 这些目录应该相互镜像,但如果有人忘记将文件复制到第二个目录,情况可能并非如此。

因此该程序将检查是否所有文件都从 Dir1 复制到 Dir2。

我遇到的问题是文件计数的速度。目前,我正在使用

find /Dir1/ -type f \( -name '*.CR2' -o -name '*.NEF' \)

因为不知道这些文件是来自佳能还是尼康相机。

在我们有数千个文件需要计算的情况下,它花费的时间太长了。

最快的方法是什么?

解决方法

要找出 Dir2 中 Dir1 缺少的内容,请使用 rsync

rsync -nir Dir1/ Dir2/

-n 是一个dryrun,所以它实际上不会复制任何东西。 -i 将为需要复制的每个文件打印一行。而 -r 使其递归。

您可以通过使用 -z 检查空输出来测试是否有任何更改。

if [[ -z $(rsync -nir  Dir1/ Dir2/) ]]; then 
  ...
fi

如果要检查另一个方向,可以添加--delete

默认情况下,rsync 使用文件大小和日期戳来确定两个文件是否相同。如果时间戳可能不同,您可以使用 --size-only 选项仅检查文件大小是否匹配,这非常快。

如果您需要将搜索限制为某些文件扩展名或其他更复杂的查询,请参阅man rsync。这是一个极其可配置的工具。