找出数据库中“未”列出的目录中的文件

时间:2011-04-08 23:36:27

标签: php sql database list

我有一个小型画廊网站,但目录中的图像数量与数据库中的图像数量差异大约为150,所以我想知道是否有办法找出/列出目录中“不是”的文件“在数据库中(反之亦然)。

基本数据库结构:

  • 图片
    • ID
    • 图像

图像名称以“imagename.jpg”

的形式存储在db中

并且图像本身存储在图像目录

图像/

2 个答案:

答案 0 :(得分:3)

将服务器中的文件名放在一个数组中,将文件中的文件放在另一个数组中。使用array_diff()获取结果。

示例(PHP):

$files_db = array("car.jpg", "bike.jpg", "plane.jpg", "ship.jpg", "tank.jpg"); 
$files_server = array("car.jpg", "bike.jpg", "ship.jpg", "rocket.jpg"); 

使用

print_r(array_diff($files_db, $files_server));

输出

Array
(
    [2] => plane.jpg
    [4] => tank.jpg
)

或(反之亦然)

print_r(array_diff($files_server, $files_db));

输出

Array
(
    [3] => rocket.jpg
)

答案 1 :(得分:2)

如果这可能是一次性问题,我会先用一个小的SQL脚本解决这个问题:

SELECT filename FROM images;

并询问数据库客户端mysqlpsql或其他任何内容将输出作为纯文本转储到文件中。 (如果您无法轻松找到数据库客户端的“转储到文件”命令,则Shell重定向可能会起作用。)

然后我会得到目录列表:

ls /path/to/images/ > ls_files

对两者进行排序:

sort db_files > db_files.sorted
sort ls_files > ls_files.sorted

然后运行diff(1)以查看哪些文件被引用在哪里:

diff -u ls_files.sorted db_files.sorted

前缀为+-的行在一个而不是另一个。

您可能需要编辑SQL输出或ls输出以使其与另一个匹配。如果您的编辑器有vim ^V块选择工具,那么其中一些编辑任务可以简化,但有时只是从另一个目录运行ls可以帮助预先添加正确的目录结构在每个文件名前面。