我试图通过内容的校验和来查找哪些文件不存在。我有两个目录/foo
,/bar
这两个目录代表系统上的任意状态,我想找到所有文件在 root 中/bar
不存在于 root 中/foo
(递归地)。/bar/**
与的词典
CheckSum -> filepath
/foo/**
减去with的字典
CheckSum -> filepath
我可以使用 md5sum 或其他东西来编写此内容,但必须已经有一个实用程序可以执行此操作。
只是为了清楚起见,如果两个文件相同除了按位置(名称和路径)我希望它们被识别为相同的。
测试用例
让我们用一些测试数据创建一棵树,
/tmp/foo
└── myFile (duplicate of /tmp/bar/quz/asdf/otherFileName)
/tmp/bar
├── qaz
│ └── findMe
└── quz
└── asdf
└── otherFileName (duplicate of /tmp/foo/myFile)
创作脚本,
mkdir -p /tmp/foo /tmp/bar/quz/asdf /tmp/bar/qaz
# One file that exists in both locations
dd if=/dev/urandom of=/tmp/foo/myFile bs=1k count=10
cp /tmp/foo/myFile /tmp/bar/quz/asdf/otherFileName
# One file (findMe) that exists in only /mpt/bar/
dd if=/dev/urandom of=/tmp/bar/qaz/findMe bs=1k count=10
所以程序比较/tmp/foo
和/tmp/bar
应该发现/tmp/bar/qaz/findMe
答案1
我会为两个树生成一个 md5sum 列表(一列表示总和,一列表示文件名),并将结果通过管道传输到一个脚本(例如 awk 或 perl)中,该脚本可以使用总和作为文件名的哈希值,并使脚本报告具有相同哈希值的文件名。
这不仅仅是一句简单的话,而且是经常被问到、经常被解决的问题(按内容搜索重复文件的结果超过一百万次)。
您可能会发现这很有帮助: