通过SQL表查找重复文件

时间:2014-01-09 21:03:55

标签: python sql file sqlite duplicates

我有很多文件(数百万),其中很多是重复文件(它们基本上是重复备份),我想半自动删除一些重复项,创建一些标识要删除的内容。

假设验证名称,大小和mtime的对应关系(上次更改文件)足以识别副本。

我用python脚本创建了一个“sqlite”表“files”,其中包含我的所有文件(每个文件一条记录)。列是: 1.“路径”文字 2.“idpath”INT(每个不同的目录都有不同的idpath) 3.“名字”文字 4.“大小”INT 5.“mtime”INT

(不简单)问题是:可以编写一个SQL语句,用于标识指定目录中存在的一组文件中的哪些文件以及所有子目录(共享所搜索目录的相同初始字符串字符) (重复)也存在于其他地方吗?


让我举一个带有以下记录的表格(以逗号分隔的字段):


    path           id  name size  mtime
    ------------   --  ---- ----  -----

    /1/1.1       , 1 , a  , 111 , 222
    /1/1.1       , 1 , b  , 111 , 222
    /1/1.1       , 1 , c  , 111 , 222
    /1/1.1       , 1 , e  , 111 , 222

    /1/1.2       , 2 , a  , 111 , 222
    /1/1.2       , 2 , b  , 111 , 8888
    /1/1.2       , 2 , c  , 111 , 222
    /1/1.2       , 2 , f  , 111 , 222
    /1/1.2/1.2.1 , 3 , b  , 111 , 8888
    /1/1.2/1.2.1 , 3 , d  , 111 , 222

    /2/1.1       , 4 , b  , 111 , 222
    /2/1.1       , 4 , c  , 111 , 222
    /2/1.1       , 4 , d  , 111 , 222

在此示例中,如果重复删除的基本目录设置为“/ 1 / 1.2”,则查询应导致:


    /1/1.2       , 2 , a , 111 , 222
    /1/1.2       , 2 , c , 111 , 222
    /1/1.2/1.2.1 , 3 , d , 111 , 222

(第一个记录“a”在“/1/1.1”中找到,第二个“c”在“/1/1.1”和“/2/1.1”中找到,第三个“d”在“/ 1/1”中找到/1.1“,并注意”d“位于基本路径的子目录中)

请注意,逻辑上b不应该在结果集中,因为它只存在于应删除文件的子目录中,而不存在于其他目录中(它具有不同的mtime)。无论如何,如果它将返回一次(但不是两次)可能是另一种解决方案。 f应该不在结果中,因为它是唯一的。


让我们说如果它有帮助我可以用python脚本重新创建表或甚至更多的表来执行任务(以及所有必需的索引以使其可用!:))。

如果所有内部文件匹配为重复(在这种情况下,可以认为所有子目录结构完全匹配),更完整的解决方案还将识别要删除的整个目录。

0 个答案:

没有答案