我有一个小型画廊网站,但目录中的图像数量与数据库中的图像数量差异大约为150,所以我想知道是否有办法找出/列出目录中“不是”的文件“在数据库中(反之亦然)。
基本数据库结构:
图像名称以“imagename.jpg”
的形式存储在db中并且图像本身存储在图像目录
中图像/
答案 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;
并询问数据库客户端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
可以帮助预先添加正确的目录结构在每个文件名前面。