【发布时间】:2013-06-30 08:01:01
【问题描述】:
有多个路径,例如:
1: /abc/def/some/common/part/xyz/file1.ext
2: /other/path/to/7433/qwe/some/common/part/anotherfile.ext
3: /misc/path/7433/qwe/some/common/part/filexx.ext
4: /2443/totally/different/path/file9988.ext
5: /abc/another/same/path/to/ppp/thisfile.ext
6: /deep1/deep2/another/same/path/to/diffone/filename.ext
我需要找到共同的部分 - 每个可能的部分,例如。如果可能的话,在上面找到共同的部分:
/some/common/part/ - in the paths 1,2,3
/another/same/path/to/ - in the 5,6
/path/to/ - in the 2,5,6
/path/ - 2,3,4,5,6
等等。
我根本不知道如何解决这个问题 - 什么方法好
- 基于字符串 - 有点查找字符串的共同部分
- 基于列表 - 将所有路径拆分为列表并在某种程度上比较常见元素的数组
- 树形图 - 有点找到图的共同部分
- 其他?
当我知道如何解决这个问题时,我(可能)能够自己编写代码 - 所以不想要免费的编程服务 - 但需要一些指导如何开始。
我确定这里已经有一些 CPAN 模块可以帮助我,但我真的不知道如何从 30k 模块列表中找到合适的有用模块来解决上述问题。 :(
编辑 - 我需要这个:
大约有200k 个文件,位于 10k 个目录中,其中许多“属于同一类”,例如:
/u/some/path/project1/subprojct/file1
/u/backup/of/work/date/project1/subproject/file2
/u/backup_of_backup/of/work/date/project1/subproject/file2
/u/new/addtions/to/projec1/subproject/file3
文件类型不同(pdf、图像、doc、txt 等),有几个是相同的(如上面的 file2 - 易于使用 Digest::MD5 过滤),但“将它们组合在一起”的唯一方法是基于在路径的“公共部分”上 - 例如"project1/subproject" 等等..
另一个文件具有相同的 MD5,因此可以过滤掉重复项,但它们位于不同的树中,例如
/u/path/some/file
/u/path/lastest_project/menu/file
/u/path/jquery/menu/file
/u/path/example/solution/jquery/menu/file
所以,文件是相同的,(相同的 md5)但需要稍微将一份副本移动到正确的位置(并删除其他文件)并且需要在一定程度上确定“最常用的”常用路径,并收集标签...(旧的路径元素是标签)
背后的想法是:
- 如果相同的 md5 文件大部分存储在某个公共路径下 - 我可以决定将一份副本移动到哪里...
而且它更复杂,但上面的解释就足够了;)
只需要降低我硬盘上的熵;)
【问题讨论】:
-
我不希望有一个 CPAN 模块来解决这个问题,这似乎是一件很不寻常的事情。需要它的应用程序是什么?
-
您可能会调整在像
diff这样的程序中使用的算法。您处理的是路径名组件而不是行,但它们都在寻找最长的公共序列。 -
如果你能说出你为什么需要找到这个会有所帮助,即你想通过解决这个问题来实现什么?
-
@devnull 补充说明
-
@Barmar 添加解释