【发布时间】:2011-04-08 23:36:26
【问题描述】:
我有一个小型画廊网站,但目录中的图像数量与数据库中的图像数量相差 150 左右,所以我想知道是否有办法找出/列出目录中的哪些文件“不是" 在数据库中(反之亦然)。
基本数据库结构:
-
图片
- 身份证
- 图片
图像名称以“imagename.jpg”的形式存储在数据库中
图像本身存储在图像目录中
图片/
【问题讨论】:
-
数据库表是什么样子的?文件是如何存储的?信息太少,无法回答这个问题。
我有一个小型画廊网站,但目录中的图像数量与数据库中的图像数量相差 150 左右,所以我想知道是否有办法找出/列出目录中的哪些文件“不是" 在数据库中(反之亦然)。
基本数据库结构:
图像名称以“imagename.jpg”的形式存储在数据库中
图像本身存储在图像目录中
图片/
【问题讨论】:
将服务器中的文件名放在一个数组中,将数据库中的文件放在另一个数组中。使用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
)
【讨论】:
$files_server = scandir('/path/to/images/');在服务器上制作文件数组。
如果这可能是一次性问题,我会用一个半途而废的解决方案来解决这个问题,首先使用一个小 SQL 脚本:
SELECT filename FROM images;
并要求数据库客户端mysql 或psql 或其他任何将输出作为纯文本转储到文件中。 (如果您无法轻松找到数据库客户端的“转储到文件”命令,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 可以帮助在每个文件名前面添加正确的目录结构。
【讨论】: