有没有办法列出驻留在公共文件系统中和主题目录中的所有未使用文件并列出它们,甚至可以选择自动删除它们?
我的意思是当前未从任何CSS样式表或任何节点链接的文件。
有没有办法列出驻留在公共文件系统中和主题目录中的所有未使用文件并列出它们,甚至可以选择自动删除它们?
我的意思是当前未从任何CSS样式表或任何节点链接的文件。
Answers:
您可以通过运行以下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
这将返回没有关联节点的所有文件。我不确定删除返回的行和文件是否安全,这可能还取决于您的模块设置。使用风险自负!
对于三年后写这篇文章的人,您可以使用一个小模块来执行此操作,称为Fancy File Delete。
在本文发布时,它处于测试阶段,因此使用风险自负。与往常一样,通过数据库查询清理孤立的任何事物都是很粗略的,其成功在很大程度上取决于您特定的模块设置。
一些可能有助于确定“ 即不再挂接到不是在文件管理的表节点或文件和目录中的文件 ”(如在关于“重复的问题怎么办删除未使用的文件? ”),是使用文件检查器模块。有关它的一些详细信息,请参见其项目页面:
在理想的Drupal世界中,您的服务器文件系统及其在Drupal的files表中的相应条目是100%同步的。但是,如果文件系统的某些部分由于某些磁盘故障而损坏了怎么办?还是您的模块之一弄乱了数据库和文件?还是您的部署脚本发疯了?好了,那么此模块将帮助您监视并找出哪些文件不同步。
开箱即用的文件表具有两种状态:临时(0)和永久(1)。文件检查器引入了其他状态“丢失(2)”。在可以以多种方式触发的验证过程的范围内,文件表的状态列将更新。
特征
- 运行验证过程:按需,通过cron,通过drush(在计划中)
- 带有过滤器的文件列表概述页面
- 视图整合
- 使用Drush命令检查文件
如果要导出视图的结果,建议使用views_data_export模块。
因此,您可以做的是这样的:
注意:即使这个问题与D7有关,它也是D8的(alfa)版本。
您可以通过删除未使用的文件
通过一些查询从file_managed表中手动删除
$this->database
->delete('file_managed')
->condition('fid', $fid, '=')
->execute();
将文件0的状态设置为,将其标记为临时文件,因此cron将在一段时间后将其删除。
$file = File::load ($fid);
$file->setTemporary();
在看中文件删除模块没有在所有的工作对我来说。这是一个更手动的替代方法。
要从不在托管文件表中的文件夹中删除文件,您可以:
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
变量更改为您要从中删除文件的任何文件夹的路径即可(并将其更新为排除文件的路径)