有没有办法 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;
我想要发生的事情:
- 从 "images" 目录中获取所有文件名
- 从数据库中获取所有文件名
- 比较然后删除仅出现在图像目录中的文件。
我不会用 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
我在 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;
我想要发生的事情:
- 从 "images" 目录中获取所有文件名
- 从数据库中获取所有文件名
- 比较然后删除仅出现在图像目录中的文件。
我不会用 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