有没有办法 find/delete 孤立文件(未在 SQL 数据库中列出)?

Is there a way to find/delete orphan files (that are not listed in the SQL database)?

我在 MySQL 数据库中有 100K 个图像文件的文件名。服务器上的图像目录包含 160K 个图像,因此有 60K 个孤立图像文件。我想删除它们。

老实说,我不知道如何进行。到目前为止,我所管理的最好的方法是从数据库中获取所有文件,然后使用 !file_exists(),但这显然只考虑了数据库中的文件。我正在寻找的文件在图像目录中,不在数据库中。

下面的代码给了你一些想法。显然我只是在数数,而不是删除,因为我还没有查看正确的文件集。

$Recordset1 = mysqli_query($dbconnect, "SELECT imgfile FROM tblimages");

$x=1;
do { 
$filename = '../images/'.$row_Recordset1['imgfile'];;
if(!file_exists($filename)) $x = $x+1;
} while ($row_Recordset1 = mysqli_fetch_assoc($Recordset1));
echo $x;

我想要发生的事情:

  1. 从 "images" 目录中获取所有文件名
  2. 从数据库中获取所有文件名
  3. 比较然后删除仅出现在图像目录中的文件。

我不会用 PHP 这样做。使用 shell 命令会更容易。

首先,对所有文件进行排序并将其保存到文本文件中:

cd images
find . -type f |sort > ../all-image_files

然后对数据库中的所有图像文件名进行排序

mysql -Bn -e "SELECT imgfile FROM tblimages ORDER BY imgfile" > ../db-image-files

(未显示:用户名、密码、主机和数据库的选项)

现在找出不同之处。一个很好的 shell 工具是 comm

comm -23 ../all-image-files ../db-image-files > ../files-to-delete

(阅读 https://linux.die.net/man/1/comm 了解详情)

然后您可以查看要删除的文件以确保您同意它的发现,然后删除它们:

cat ../files-to-delete | xargs rm