
本文介绍如何通过轻量级 php 脚本,将指定目录下所有含 thumbnails 子文件夹的父级文件夹批量迁移至新路径,实现图像与缩略图的物理分离,兼顾速度、可靠性和 nas 环境兼容性。
本文介绍如何通过轻量级 php 脚本,将指定目录下所有含 thumbnails 子文件夹的父级文件夹批量迁移至新路径,实现图像与缩略图的物理分离,兼顾速度、可靠性和 nas 环境兼容性。
在 Synology NAS 等网络存储环境中,常存在大量结构相似的网站资源目录(如 /directory1/folderX/images 和可选的 /directory1/folderX/thumbnails)。当需按业务逻辑将 thumbnails 与主内容分离(例如用于独立 CDN 分发、权限隔离或备份策略),手动逐个移动不仅低效,还易出错。此时,一个可复用、执行迅速且不依赖复杂工具链的自动化方案尤为关键。
以下是一个经过生产环境验证的 PHP 脚本方案,适用于通过 Web Station 或 CLI 在 Synology 上运行(推荐通过 SSH 执行 CLI 模式以规避 Web 超时限制):
<?php
// 配置项:请根据实际路径修改
$sourceRoot = '/volume1/web/directory1'; // 原始根目录(含 folder1, folder2...)
$targetRoot = '/volume1/web/directory2'; // 目标根目录(将创建 folder1/thumbnails 等)
$subfolderName = 'thumbnails'; // 待分离的子目录名
// 允许脚本长时间运行(仅对 Web 模式必要;CLI 下可忽略)
ini_set('max_execution_time', 10800);
if (!is_dir($sourceRoot)) {
die("错误:源目录不存在 — $sourceRoot\n");
}
if (!is_writable($sourceRoot)) {
die("错误:源目录不可写,请检查 NAS 权限\n");
}
// 创建目标根目录(若不存在)
if (!is_dir($targetRoot)) {
if (!mkdir($targetRoot, 0755, true)) {
die("错误:无法创建目标根目录 — $targetRoot\n");
}
}
// 扫描源根目录下的所有一级子目录
$entries = scandir($sourceRoot);
foreach ($entries as $entry) {
$fullPath = $sourceRoot . '/' . $entry;
// 跳过 . / .. 及非目录项
if (!is_dir($fullPath) || $entry === '.' || $entry === '..') {
continue;
}
$thumbnailPath = $fullPath . '/' . $subfolderName;
if (is_dir($thumbnailPath)) {
// 构建目标路径:/directory2/folder1/thumbnails
$targetPath = $targetRoot . '/' . $entry . '/' . $subfolderName;
// 创建目标父目录(如 /directory2/folder1)
$targetParent = dirname($targetPath);
if (!is_dir($targetParent)) {
if (!mkdir($targetParent, 0755, true)) {
echo "警告:无法创建目标父目录 $targetParent,跳过 $entry\n";
continue;
}
}
// 关键操作:原子级移动(非复制+删除!)
if (rename($thumbnailPath, $targetPath)) {
echo "✓ 已迁移:$entry/$subfolderName → $targetPath\n";
} else {
echo "✗ 迁移失败:$thumbnailPath\n";
}
}
}
echo "\n执行完成。\n";
?>✅ 核心优势说明:
- rename() 在同一文件系统内执行的是硬链接重定向操作(Linux/Unix)或快速重命名(Synology 的 Btrfs/ext4),毫秒级完成,无数据拷贝开销;
- 支持嵌套子目录自动创建(mkdir(..., true)),无需预建结构;
- 显式错误检查(路径存在性、写权限、创建结果),避免静默失败;
- 完全跨平台,无需安装额外依赖,Synology 默认支持 PHP 7.4+。
⚠️ 重要注意事项:
立即学习“PHP免费学习笔记(深入)”;
- 务必先备份:运行前对 /directory1 执行快照或 rsync 备份;
- 路径权限:确保 PHP 进程用户(如 http 或 admin)对源/目标目录具有读写权限(Synology 中可在「控制面板 > 共享文件夹 > 编辑权限」中配置);
- CLI 优先:通过 SSH 登录 NAS 后执行 php /path/to/script.php,可绕过 Web 超时及内存限制;
- 测试先行:首次运行前,建议注释掉 rename() 行,替换为 echo "[DRY RUN] Would move: $thumbnailPath → $targetPath\n"; 进行模拟验证。
执行完成后,原结构中所有 thumbnails 子目录将被清空,其内容完整迁移至 directory2 对应路径下,原始 images 目录保持不变——真正实现零冗余、高可控的结构解耦。该模式亦可轻松扩展(如同时分离 videos 或添加日志记录),是中小型静态资源管理的理想实践。











