清理TYPO3中的重复文件

问题描述 投票:0回答:1

我的 TYPO3 安装中有几个重复的文件。有 2 种不同类型的重复项:

  1. 数据库重复:sys_file 中同一文件有多个条目(不同的 uid、相同的标识符和存储)
  2. 实际重复文件:多个文件具有完全相同的内容(不同的存储/标识符,但 sys_file 中的 sha1 相同)

创建实际重复项 (1) 的原因是:

  • 首先,这是一个较旧的站点,因此之前的行为(FAL 之前)无论如何都会导致重复,然后将其移至 _migerated。 (我不确定升级向导当时是否也做了一些清理工作。)
  • 编辑有时只是多次上传内容,并且丢失了对现有文件的跟踪(尽管使用了文件挂载点和合理的直接结构)

我现在想做的是创建一个脚本/扩展来清理它或协助编辑器清理它(例如显示重复项)。

  • 可以合并具有相同内容哈希(sha1)但不同文件名/路径的文件,这意味着也合并所有引用
  • sys_file 中的数据库重复项也应该合并(小心处理引用)

我大致了解如何做到这一点,但想知道是否已经有任何人可以分享的工具、经验或知识。

typo3
1个回答
1
投票

这是两件不同的事情:

  1. sys_file(数据库表)中存在重复,其中 uid 不同,但标识符和存储相同。这是不一致的情况,通常不应发生。它可能是由于文件处理不当或以前的错误而发生的。这应该尽快修复。
  2. 重复,其中文件内容相同,但路径不同。理想情况下,这种情况不应该发生,但修复起来并不容易:这些文件可能位于文件系统中的不同位置,其中某些编辑者可能有权访问其中一个,但没有另一个。如果可能的话,清理它是有意义的。但这本身并不总是一个问题。

对于这两种情况,都应该非常小心,不要让情况变得更糟。一般来说,请遵循以下建议,以防止 TYPO3 中的文件出现问题和不一致:

  • 处理文件时最好仅使用 TYPO3 功能,不要直接在文件系统上添加、重命名或删除它们(除非您知道自己在做什么)。原因是每个文件的 DB sys_file 中都有一个条目,如果文件发生更改,则应更新该条目。如果您使用 TYPO3 功能,这种情况会自动发生。
  • 在删除文件和/或 sys_file 条目之前,检查是否存在对此文件的引用

1a。检查 sys_file 是否有重复项

在数据库查询重复项时,可以在sys_file中查询uid不同,但identifer相同的记录,但是(!):

  • 确保您不仅考虑标识符,还要检查存储(标识符、存储应该是唯一的)。即使您只有一个存储(fileadmin),对于由 TYPO3 处理但不在 fileadmin 中的文件,也可能存在额外的系统存储(存储=0)
  • 请记住,数据库查询通常不区分大小写

所以这还不够:

# 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
并不总是正确的,这也应该得到修复。

1b。修复 sys_file 重复项

有一个扩展

elementareteilchen/unduplicator
,但请先查看我的问题并仔细检查这是否适用于您的系统:

2.修复内容重复

在评论中,有人建议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 功能获取参考。

© www.soinside.com 2019 - 2024. All rights reserved.