查找其他目录中不存在的文件

查找其他目录中不存在的文件

dir1我需要找到所有存在于 中但不存在于 中的文件dir2dir1并且dir2可能有不同的结构,所以diff -r不能很好地工作。

答案1

尝试创建一个不带路径的文件列表。这样,您就可以比较两个目录。但是,文件名应该全部不同。如果在 dir1 的不同子目录中重复使用相同的文件名,则删除路径将删除文件名的唯一性。您可以获得不带路径名的每个目录的列表,如下所示:

find dir1/ -exec basename {} \; | sort
find dir2/ -exec basename {} \; | sort

全部加起来看起来像这样

diff <(find dir1/ -exec basename {} \; | sort) <(find dir2/ -exec basename {} \; | sort)

我看到有评论建议使用 fdupes。fdupes如果绝对有更好的解决方案。

答案2

一个粗略的方法可能是使用md5sum.请注意,长度为零的文件始终会被视为重复项,因此您可能find只需要长度至少为 1 个字节的文件。

find /first/path -type f -exec md5sum -b \{\} \; > /tmp/md5-path1.txt
cut -b1-32 < /tmp/md5-path1-short.txt
find /second/path -type f -exec md5sum -b \{\} \; > /tmp/md5-path2.txt
cut -b1-32 < /tmp/md5-path2-short.txt

path1 中不在 path2 中的文件(删除“-v”选项

grep /tmp/md5-path1.txt -v -F -f /tmp/md5/path2-short.txt

CYA级别:专业

上面的 32 是因为 MD5 哈希值的长度是 32 个字节。例如,如果您使用 ,sha1sum它的碰撞机会更小,那么您将使用长度 40;sha224sum需要 56、sha256sum需要 64 和sha512sum128。

CYA级别:偏执

这在某些元数据保存在文件中的缓存方案中可能不起作用其名称包含原始文件的哈希值

(这实际上发生在我几年前安装的 Wordpress + Magento 上,我们想要迁移巨大的文章缓存,同时删除过时的条目)。

在这种情况下,您必须使用不同的散列方案 - 快速修复 - 以避免grep返回误报,将元数据条目误认为原始文件(因此,如果缓存使用 MD5,则使用 SHA1,反之亦然);或者使用sed重写“短”文件中的所有行以在开头添加“^”,从而使其成为锚定的正则表达式,并删除标志-Fgrep将文件作为正则表达式而不是纯字符串处理。

答案3

所以,我找到的部分解决方案是:

find dir1 -type f | grep -vxFf <(fdupes -r dir1 dir2)

但我说“部分”,因为如果 中有重复项dir1,它们将不会显示,因此您需要fdupes -r dir1首先运行。

相关内容