📁 批量目录重命名工具(适用于 BuddyPress / WordPress 路径重构)

VFX大学 wordpress开发 📁 批量目录重命名工具(适用于 BuddyPress / WordPress 路径重构)

标签: 

  • 该话题为空。
正在查看 0 条回复
  • 作者
    帖子
    • #847

      追光
      管理员

      NewVFX在更换部分User id后导致数万用户头像不显示,原来是每个用户的头像存储在avatar目录下,每个目录以userid命名,于是制作了这个批量替换工具,在几分钟内完成了工作。这里记录并分享给大家:

      🧩 工具用途

      本工具适用于以下场景:

      • 你的网站曾使用过超长 ID(如 3962352152127408)作为用户目录;

      • 后期将用户 ID 改为简短格式(如 98927408)后,想要同步更新头像目录名;

      • 数据库引用已更新,但实际头像文件夹仍为旧目录,导致头像加载失败;

      • 你希望通过可视化界面,自定义规则批量替换所有目录名。


      🖥 使用方式

      将下面的文件保存为一个php,放到网站任意目录,适合你访问到就可以。

      
      <?php
      // 设置基础目录(可根据需要手动修改)
      $avatar_dir = "/www/wwwroot/NewVFX/j/avatars";
      $avatar_dir = rtrim($avatar_dir, '/');
      
      // 处理表单提交
      $result = '';
      if ($_SERVER['REQUEST_METHOD'] === 'POST') {
          $old_prefix = trim($_POST['old_prefix']);
          $new_prefix = trim($_POST['new_prefix']);
          $suffix_length = intval($_POST['suffix_length']);
      
          if (!$old_prefix || !$new_prefix || $suffix_length <= 0) {
              $result = "❌ 请填写完整参数。";
          } else {
              $dirs = scandir($avatar_dir);
              $count = 0;
              $skipped = 0;
              $renamed = [];
      
              foreach ($dirs as $dir) {
                  if ($dir === '.' || $dir === '..') continue;
      
                  if (strpos($dir, $old_prefix) === 0 && is_dir($avatar_dir . '/' . $dir)) {
                      $suffix = substr($dir, -$suffix_length);
                      $new_name = $new_prefix . $suffix;
                      $old_path = $avatar_dir . '/' . $dir;
                      $new_path = $avatar_dir . '/' . $new_name;
      
                      if (!file_exists($new_path)) {
                          rename($old_path, $new_path);
                          $renamed[] = "✅ $dir → $new_name";
                          $count++;
                      } else {
                          $renamed[] = "⚠️ $dir → $new_name 已存在,跳过";
                          $skipped++;
                      }
                  }
              }
      
              $result = "<strong>🎉 重命名完成:</strong><br>"
                      . implode('<br>', $renamed)
                      . "<br><br>共重命名:<b>$count</b> 个,跳过:<b>$skipped</b> 个。";
          }
      }
      ?>
      
      <!DOCTYPE html>
      <html>
      <head>
          <meta charset="UTF-8">
          <title>📁 批量目录重命名工具</title>
          <style>
              body {
                  font-family: Arial, sans-serif;
                  padding: 30px;
                  background: #f7f7f7;
              }
              form {
                  background: #fff;
                  padding: 20px;
                  border-radius: 8px;
                  width: 500px;
                  box-shadow: 0 0 8px rgba(0,0,0,0.1);
              }
              label {
                  font-weight: bold;
                  display: block;
                  margin-top: 15px;
              }
              input[type="text"], input[type="number"] {
                  width: 100%;
                  padding: 8px;
                  margin-top: 5px;
                  box-sizing: border-box;
              }
              button {
                  margin-top: 20px;
                  padding: 10px 20px;
                  font-weight: bold;
                  background: #28a745;
                  color: #fff;
                  border: none;
                  border-radius: 6px;
                  cursor: pointer;
              }
              button:hover {
                  background: #218838;
              }
              .result {
                  margin-top: 30px;
                  padding: 20px;
                  background: #fff;
                  border-left: 5px solid #007bff;
              }
          </style>
      </head>
      <body>
      
          <h2>🔧 批量重命名目录工具</h2>
          <form method="POST">
              <label>原始前缀(如 39623521521)</label>
              <input type="text" name="old_prefix" required>
      
              <label>新的前缀(如 989)</label>
              <input type="text" name="new_prefix" required>
      
              <label>后缀保留位数(如 7)</label>
              <input type="number" name="suffix_length" min="1" required>
      
              <button type="submit">开始替换</button>
          </form>
      
          <?php if ($result): ?>
              <div class="result"><?= $result ?></div>
          <?php endif; ?>
      
      </body>
      </html>
      1. rename-tool.php 上传到你服务器的网站根目录或任何后台目录;

      2. 通过浏览器访问这个文件(如:https://yoursite.com/rename-tool.php);

      3. 填写参数后点击【开始替换】按钮,即可自动重命名所有匹配目录。


      ✅ 表单参数说明

      参数

      示例

      说明

      原始前缀

      39623521521

      原用户 ID 的前缀部分

      新的前缀

      989

      替换成的新用户 ID 前缀

      后缀保留位数

      7

      仅保留原 ID 最后 7 位,例如 2127408


      📝 操作日志功能(可选增强)

      如果你希望记录每次替换操作的日志,你可以在重命名成功处加入如下日志代码(追加写入 .log 文件):

      $log_file = __DIR__ . '/rename-log.log';
      file_put_contents($log_file, date('[Y-m-d H:i:s] ') . "$dir => $new_name\n", FILE_APPEND);

      添加位置:在 rename($old_path, $new_path); 后面一行。


      📂 示例操作

      假设有旧目录:

      /www/wwwroot/NewVFX/j/avatars/3962352152127408

      你填写如下:

      • 原始前缀:39623521521

      • 新前缀:989

      • 后缀保留位数:7

      点击提交后,它将被重命名为:

      /www/wwwroot/NewVFX/j/avatars/98927408


      🛡 注意事项

      • 原目录必须以你指定的旧前缀开头;

      • 工具不会处理文件,只处理一级目录;

      • 如果目标目录已存在,工具将跳过,并提示「已存在,跳过」;

      • 大批量操前请先备份文件,建议先备份或测试后再使用少量。

正在查看 0 条回复
  • 在下方一键注册,登录后就可以回复啦。