如何在 Shell 或 Python 中创建 Linux 目录的散列?

How can I create a hash of a directory in Linux in Shell or Python?

Linux 中获取目录哈希函数的最简单方法是什么(最好使用 shell 脚本Python)?

我想做的是在一个大目录树中找到重复的子树。

fdupesmeld 等倾向于希望这两棵树在很大程度上是同构的,即。给出

A
└─ B

A
└─ C
   └─ B

如果 B 在两棵树中相同,他们不会提醒我,因为在第二棵树中它在 C 下。

所以我猜我需要编写自己的脚本来递归两棵树并找到所有子树的哈希值,然后比较它们。

仅使用文件名散列目录结构

列出目录中的所有文件路径(递归),sort 它们(以防 find 搞砸),用 sha1sum 散列它并打印散列:

find /my/dir -mindepth 1 -type f -print0 | sort -z | sha1sum

您可以将其放入脚本中,例如:

#!/bin/bash
# hashtree-names.sh - hash a dir's structure by filenames
# (files with same names are considered identical)
# Usage: hashtree-names.sh <dirname>
DIR=
find $DIR -mindepth 1 -type f -print0 | sort -z | sha1sum

然后像这样在大树下的每个目录上执行它:

find /my/tree -mindepth 1 -type d -exec hashtree-names.sh {} \; | sort

这将产生类似于以下的输出:

3cd8fea391f3055d9de3d6e05a422b6e97ce4204 *-
8cd93d83e9baeea479785fe0cc03c8b58aa293a3 *-
8cd93d83e9baeea479785fe0cc03c8b58aa293a3 *-
fe7dd981bb0d978608ba648eb3d38bb41f6cd956 *-
afc483808be60fbd48e716a7b916b5deaa9c78b5 *-
a518cfa27e7e9afbab2ba2209c80dbab0631736b *-
251f3cfc11eeccdfaf28142dadc5aa3aa4e2aec1 *-
251f3cfc11eeccdfaf28142dadc5aa3aa4e2aec1 *-
4a689e7c27733498c4ac5730f172c844cb6b21d1 *-
600a61b8c1a973aa6322ab4a7d57f7c07174e0ec *-
a401f27520252ae334625ca1b452396f0287f42d *-
e0b2d5f825f062d40f0f2490673888b5eb6c66fd *-
85a533625c5a38892d392f2ae9e7974e3eceaf6a *-

散列目录结构,包括文件内容

参见Vatine's and David Schmitt's answers to Linux: compute a single hash for a given folder & contents?

编辑 2017-01-27

  • 代码改进:将 -mindepth 1 添加到 find