我的 TYPO3 安装中有几个重复的文件。有 2 种不同类型的重复项:
创建实际重复项 (1) 的原因是:
我现在想做的是创建一个脚本/扩展来清理它或协助编辑器清理它(例如显示重复项)。
我大致了解如何做到这一点,但想知道是否已经有任何人可以分享的工具、经验或知识。
这是两件不同的事情:
对于这两种情况,都应该非常小心,不要让情况变得更糟。一般来说,请遵循以下建议,以防止 TYPO3 中的文件出现问题和不一致:
在数据库查询重复项时,可以在sys_file中查询uid不同,但identifer相同的记录,但是(!):
所以这还不够:
# not recommended
SELECT identifier,count(*) from sys_file group by identifier having count(*) > 1;
更好:
查询1:
SELECT storage,MAX(identifier),COUNT(*)
FROM sys_file
GROUP BY md5(identifier),storage
HAVING COUNT(*) > 1
ORDER BY storage,MAX(identifier);
替代方案(如果identifier_hash正确,也应该有效。由于已经存在不一致的情况,因此不要仅仅依赖于此,而是确保这一点似乎是个好主意):
查询2:
SELECT storage,identifier,count(*) AS c
FROM sys_file
GROUP BY identifier,storage,identifier_hash
HAVING count(*) > 1
ORDER BY storage,identifier;
如果查询 1 和 2 返回不同数量的结果,则有理由相信
indentifier_hash
并不总是正确的,这也应该得到修复。
有一个扩展
elementareteilchen/unduplicator
,但请先查看我的问题并仔细检查这是否适用于您的系统:
在评论中,有人建议https://github.com/fabarea/media。 我对此没有任何经验。
重要的是首先修复 sys_file 重复项(如果有)(或更改数据库查询,以便不考虑具有不同 uid 但相同存储和标识符的条目)。
一种可能的方法可能是:
您可以通过搜索具有不同 uid 但相同哈希值的条目来搜索内容重复
sys_file.sha1
:
SELECT f1.uid,f2.uid,f1.sha1,f2.sha1,f1.storage,f1.identifier,f2.storage,f2.identifier
FROM sys_file f1
INNER JOIN sys_file f2
ON f1.sha1=f2.sha1
WHERE f1.uid != f2.uid
and BINARY f1.identifier != BINARY f2.identifier;
一个相对容易实现的安全解决方案是仅删除没有引用的重复项。使用 TYPO3 功能获取参考。