使用MySQL查询和BASH,我如何删除、重命名或移动Drupal节点在某个日期之前使用的所有图像文件



如果你感兴趣的背景: 我的一个朋友拥有一本杂志,自2011年以来一直在发布相应的Drupal 7网站。该网站有数千篇文章和大约50000张支持这些文章的图片。不幸的是,由于版权诽谤律师的原因,他已经因他认为来自"创意公地"的图片而受到了几起侵犯版权的诉讼。自2016年第一次诉讼以来,他确保所有图片都来自一家股票图片公司。但很明显,就在最近,2016年之前的另一张照片引起了另一个版权巨魔的18000美元(顺便说一句,这实际上是一张热狗的照片)。尽管如此,他的商业保险公司只是想支付和解费,而不是在法庭上冒任何风险,但要求今后从网站上删除所有潜在的可疑图片。由于在他的网站上发布的95%的故事的浏览量都不到1000次(广告商的浏览量不到50美分),他同意删除所有这些图片,因为50美元绝对不值得再冒险喂养任何巨魔

问题:删除、重命名或移动2016年某个日期之前连接到故事节点的所有图像的最佳方法是什么?如果我们能暂时将文件系统上的文件名从"trollfood.jpg"更改为"trollfood.jpg.bak"(或其他什么),这样如果/当他能确保一个映像实际上在公共域中时,他就能恢复它,那就太好了,如果我们可以暂时用占位符图像链接替换所有潜在的可疑图像链接(在数据库中)(这样人们仍然可以阅读文章而不想知道图像去了哪里…也许图像将是对钓鱼情况的简要解释)。无论如何,我已经有一分钟没有用Drupal做任何事情了,所以我忘记了Drupal是如何将文件链接到节点的(他有一些自定义的内容类型来支持他的主要文章)。

我已经能够通过mysql:获得列表中所有潜在的可疑图像

SELECT fid, filename, timestamp, from_unixtime(timestamp, "%Y-%m-%e") 
FROM drupal7_therooster.file_managed 
where timestamp between unix_timestamp('2011-01-01') and unix_timestamp('2017-01-01');
// here's sample output:
# fid   filename                        timestamp   from_unixtime(timestamp, "%Y-%m-%e")
6154    _MG_5147.jpg                    1373763148  2013-07-14
6155    _MG_5179.jpg                    1373763148  2013-07-14
6161    The Lone Bellow (4 of 5).jpg    1373866156  2013-07-15
6162    The Lone Bellow (1 of 5).jpg    1373866156  2013-07-15

现在,我如何使用它来查找使用这些图像的潜在冒犯性故事,并执行以下操作:

  1. 创建一个使用这些图像的所有故事的列表,这样我就可以保存它,以防他想要恢复这些图像。我对SQL很了解。。。我只是不知道哪些表保存哪些数据
  2. 创建一个查询,将这些故事中的这些图像关联替换为占位符图像(因此,如果故事使用"trollfood.jpg",则该故事现在使用"safetyimageplaceholder.jpg"。有些故事附带了多个图像
  3. 一旦所有潜在的冒犯性文章都引用了占位符图像,我仍然需要移动所有冒犯性文件,这样律师就无法访问它们。。。顺便说一下,我可以通过ssh访问。有没有什么好的方法可以使用bash命令只移动/重命名与我从SQL查询中生成的列表匹配的文件?我只是想小心不要删除/重命名/移动任何不属于查询的图像。请记住,文件系统中的文件创建日期在服务器上都是2017+,因为服务器是在2017年移动(或复制)的,因此文件系统的原始创建日期不准确

我知道这是一个很长的问题。。。它涉及一个Drupal网站,但我认为我可能需要合适的SQL和bash专家的帮助,所以我在这里发布了它,而不是Drupal特定的stackexchange。如果另一种完全不同的方法更适合这个问题,我完全愿意接受任何建议。干杯

我能够回答自己的问题。我必须做三件主要的事情:

第一步:为Drupal的MySQL数据库创建一个查询,该查询将为我提供2012年至2017年间创建的节点使用的所有潜在侵犯版权文件的列表:

SELECT fm.fid, fm.filename, 
n.title, n.nid, from_unixtime(n.created, "%Y-%m-%d") as 'node_date'
FROM file_managed fm 
JOIN file_usage fu ON fm.fid = fu.fid 
JOIN node n ON fu.id = n.nid
WHERE created BETWEEN unix_timestamp('2012-01-01') AND unix_timestamp('2017-01-01')
ORDER BY node_date

这是一个适度复杂的查询,但基本上它连接了三个表(Drupal7的file_managednodefile_usage表)中的列。file_usage表是在哪些节点(经由nid)上使用哪些文件(经由fid)的共享密钥寄存器。

第二步:组织并过滤数据以创建文件列表。

我按照节点创建的日期对结果进行了筛选和排序。在第一步中,我从联接查询中获得了大约48K条记录,然后我创建了一个谷歌电子表格来清理和排序数据。以下是谷歌电子表格的示例。此表还包括node_counter表中的数据,该表跟踪每个节点的页面视图。使用一个简单的VLOOKUP函数来匹配主工作表上每个nid的总页面视图,现在可以按页面视图对主工作表进行排序。我这样做是为了优先考虑我应该首先检查的每个节点/文章的图像。这是我用来从数据库中获取数据的sql查询:

SELECT nid, totalcount, daycount, from_unixtime(timestamp, "%Y-%m-%d") as 'date'
FROM node_counter
ORDER BY totalcount DESC

第三步:编写一个Shell脚本,该脚本将获取经过筛选的文件列表,并将它们移动到安全的地方(并从公共Web服务器上移除)。

基本上,我需要一个简单的BASH脚本,它将使用第二步中的文件列表将它们从web服务器上移除。请记住,当每个图像文件上传到服务器时,Drupal可以(并且确实)创建大约十几个不同的纵横比和大小,并将这些副本中的每一个放置到相应的文件夹中。例如,一个图像文件名可以被复制并调整为:

  • files/collimage.jpg
  • files/legal/coolimage.jpg
  • files/hero/collimage.jpg
  • files/t缩略图/collimage.jpg
  • 文件/*/coolimage.jpg等

因此,我必须列出大约50K个文件名,并在十几个不同的子文件夹中检查这些文件名,如果它们存在于子文件夹中,则将每个文件名移动到存档文件夹中,同时保留文件夹/文件树结构,并将"安全"的文件保留在公共web服务器上。所以…我最终写了这个简单的脚本,并在Github上开源,以防其他人从中受益。

就是这样!谢天谢地,我知道一些SQL以及如何使用谷歌电子表格。。。还有一些基本的狂欢。。以及如何使用谷歌并解决问题。如果谷歌用户能够在未来发现这一点。。。欢呼

最新更新