我有很多文件(数百万),其中很多是重复文件(它们基本上是重复备份),我想半自动删除一些重复项,创建一些标识要删除的内容。
假设验证名称,大小和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脚本重新创建表或甚至更多的表来执行任务(以及所有必需的索引以使其可用!:))。
如果所有内部文件匹配为重复(在这种情况下,可以认为所有子目录结构完全匹配),更完整的解决方案还将识别要删除的整个目录。