如何查找未从任何CSS样式表或任何节点链接的孤立文件和图像?


21

有没有办法列出驻留在公共文件系统中和主题目录中的所有未使用文件并列出它们,甚至可以选择自动删除它们?

我的意思是当前未从任何CSS样式表或任何节点链接的文件。


我也想知道答案,感谢您发布问题!
NPC

您是指使用字段上传的文件(例如ImageField)还是常规文件(通过IMCE上传)?我认为您可以在不搜索每个节点主体以获取引用的情况下跟踪IMCE上传。
Chaulky

是的,我正在通过IMCE上传。我希望有一个模块可以执行您所说的:扫描节点以查找图像引用,然后对于内部drupal引用(无域)扫描相关目录并比较两者以查找未使用的文件。也许对现有模块中的链接进行类似的操作以查找断开的链接。所以我想,也许类似的模块存在的图像,但也许不是..
camcam

Answers:


14

您可以通过运行以下MySQL查询来查找孤立文件:

SELECT fm.*
FROM file_managed AS fm
LEFT OUTER JOIN file_usage AS fu ON (fm.fid = fu.fid)
LEFT OUTER JOIN node AS n ON (fu.id = n.nid)
WHERE fu.type = 'node' AND n.nid IS NULL

这将返回没有关联节点的所有文件。我不确定删除返回的行和文件是否安全,这可能还取决于您的模块设置。使用风险自负!

来源:http : //drupal.org/node/733258#comment-5582764


5
您可能已经共享了从其中复制帖子的原始帖子的链接。... drupal.org/node/733258#comment-5582764我认为不显示消息来源是非常不道德的。
Sk8erPeter 2012年

在上面发布的链接之后,我还认为drupal.org/node/733258#comment-7427898中的代码很有用,因为它将删除孤立的文件及其在数据库中的相应条目。
Marcos Buarque 2013年

实际上,@ Sk8erPeter应该对答案中的信息进行汇总,然后链接到它。特别是如果它们来自Stack Exchange以外的来源。
Christia

1
@Christia,如果您在编辑原始文章之前先阅读了原始文章(将链接放入答案中),则可以看到David逐字复制了别人的评论,甚至没有提及其来源并在文章周围加上了引号。这可以被视为窃,这就是我的评论。:)
Sk8erPeter

您会发现这会产生一些重复的文件ID,为避免这种情况,并添加了我添加的分组依据的重复计数。从文件管理的AS中选择​​fm。*,COUNT(*)fm左外部联接file_usage AS FU ON(fm.fid = fu.fid)左外部联接节点AS n ON(fu.id = n.nid)WHERE fu.type = 'node'和n.nid是NULL GROUP BY fm.fid;
卡梅伦

5

对于三年后写这篇文章的人,您可以使用一个小模块来执行此操作,称为Fancy File Delete

在本文发布时,它处于测试阶段,因此使用风险自负。与往常一样,通过数据库查询清理孤立的任何事物都是很粗略的,其成功在很大程度上取决于您特定的模块设置。


我发现这个模块非常有问题-到了毫无用处的地步。嗯
菲利克斯·夏娃

3

一些可能有助于确定“ 即不再挂接到不是在文件管理的表节点或文件和目录中的文件 ”(如在关于“重复的问题怎么办删除未使用的文件? ”),是使用文件检查器模块。有关它的一些详细信息,请参见其项目页面:

在理想的Drupal世界中,您的服务器文件系统及其在Drupal的files表中的相应条目是100%同步的。但是,如果文件系统的某些部分由于某些磁盘故障而损坏了怎么办?还是您的模块之一弄乱了数据库和文件?还是您的部署脚本发疯了?好了,那么此模块将帮助您监视并找出哪些文件不同步。

开箱即用的文件表具有两种状态:临时(0)和永久(1)。文件检查器引入了其他状态“丢失(2)”。在可以以多种方式触发的验证过程的范围内,文件表的状态列将更新。

特征

  • 运行验证过程:按需,通过cron,通过drush(在计划中)
  • 带有过滤器的文件列表概述页面
  • 视图整合
  • 使用Drush命令检查文件

如果要导出视图的结果,建议使用views_data_export模块。

因此,您可以做的是这样的:

  • 将您的网站克隆(复制)到某个开发环境,但不要复制您要检查的目录中的任何文件。作为变体(如果此问题与非生产状态网站有关),只需将所有文件临时移出该目录即可。
  • 使用文件检查器模块找出“丢失”了哪些文件:这些文件显然没有被使用。但是此模块没有争论的任何文件都没有使用!
  • 通过将所有丢失的文件复制到要检查的目录的正确位置,然后逐步创建目录的完美内容。

注意:即使这个问题与D7有关,它也是D8的(alfa)版本。


解决我的问题的非常有用的方法
kb8

2

有一个模块可以删除不需要的文件,删除文件

查看所有托管文件,并带有通过VBO自定义操作强制删除它们的选项(如果确实需要,可以通过FID手动删除托管文件)和强制删除的选项。从默认文件目录中删除不在文件托管表中的未使用文件。也就是删除所有非托管文件。从整个安装中删除不再附加到节点和文件使用情况表的未使用文件。也就是删除所有孤立文件。


1
我对大型的大规模操作和vbo模块有不好的经验。最初,我将使用Pierre.Vriens建议的方法,之后将使用您的意见模块来保持文件目录的干净。
KB8

0

您可以通过删除未使用的文件

  1. 通过一些查询从file_managed表中手动删除

    $this->database ->delete('file_managed') ->condition('fid', $fid, '=') ->execute();

  2. 将文件0的状态设置为,将其标记为临时文件,因此cron将在一段时间后将其删除。
    $file = File::load ($fid); $file->setTemporary();


0

看中文件删除模块没有在所有的工作对我来说。这是一个更手动的替代方法。

要从不在托管文件表中的文件夹中删除文件,您可以:

1)创建所有托管文件的列表:

mysql whateverdb -e "select filename from file_managed" > ~/managed-files.txt

2)从目录中删除不在该列表中的所有文件。为此,我使用了一个小的bash脚本:

#!/bin/bash

IMG_FOLDER='/var/www/html/yoursite/docroot/sites/default/files/certain-images'
EXCLUDES='/home/yourhomeuser/managed-files.txt'

for FILE in $IMG_FOLDER/*; do
  if ! grep "$FILE" "$EXCLUDES"; then
        echo "Deleting $FILE"
        rm -f "$FILE"
  fi
done

只需将IMG_FOLDER变量更改为您要从中删除文件的任何文件夹的路径即可(并将其更新为排除文件的路径)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.