You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:实现递归调换子目录层级结构的脚本方案

我完全懂你这种被目录结构调整+空格路径坑到的痛苦!刚好我之前处理过类似的需求,给你两个实用的方案,不管你习惯用Shell还是Python都能搞定:

方案一:Shell脚本(适用于Linux/macOS)

这个脚本会自动遍历所有类型目录下的Person子目录,把内容迁移到按Person分类的结构里,完美处理带空格的路径:

#!/bin/bash

# 替换成你的实际根目录路径,有空格的话一定要用双引号包裹
ROOT_DIR="Dir"

# 遍历所有类型目录下的Person子目录(深度固定为2层)
find "$ROOT_DIR" -mindepth 2 -maxdepth 2 -type d | while read -r PERSON_DIR; do
    # 拆分出类型(Documents/Pictures/Mails)和Person名称
    TYPE=$(basename "$(dirname "$PERSON_DIR")")
    PERSON=$(basename "$PERSON_DIR")
    
    # 构建目标目录路径
    TARGET_DIR="$ROOT_DIR/$PERSON/$TYPE"
    
    # 自动创建多级目标目录(如果不存在)
    mkdir -p "$TARGET_DIR"
    
    # 移动原目录下的所有内容到目标目录,引号确保空格路径被正确识别
    mv "$PERSON_DIR"/* "$TARGET_DIR"/
    
    # 删除空的原Person目录
    rmdir "$PERSON_DIR"
done

# 清理原类型目录中已经空的目录(可选,按需保留)
find "$ROOT_DIR" -mindepth 1 -maxdepth 1 -type d -empty -delete

关键细节说明:

  • 用read -r读取路径,避免空格被错误拆分
  • 所有路径都用双引号包裹,彻底解决空格路径的问题
  • mkdir -p会自动创建父目录(比如PersonA目录不存在时,会先创建它再创建下面的Documents)
  • 最后一步的空目录清理可以根据需求选择是否保留

方案二:Python脚本(跨平台通用,Windows/Linux/macOS都能用)

如果对Shell不太熟悉,Python的方案更直观,处理路径也更安全:

import os
import shutil

# 替换成你的实际根目录路径
root_dir = "Dir"

# 遍历根目录下的所有类型目录
for type_name in os.listdir(root_dir):
    type_path = os.path.join(root_dir, type_name)
    if not os.path.isdir(type_path):
        continue  # 跳过非目录文件
    
    # 遍历当前类型目录下的所有Person目录
    for person_name in os.listdir(type_path):
        person_path = os.path.join(type_path, person_name)
        if not os.path.isdir(person_path):
            continue
        
        # 构建目标目录:Dir/PersonA/Documents
        target_dir = os.path.join(root_dir, person_name, type_name)
        # 创建目标目录,已存在也不会报错
        os.makedirs(target_dir, exist_ok=True)
        
        # 移动原Person目录下的所有内容到目标目录
        for item in os.listdir(person_path):
            src_item = os.path.join(person_path, item)
            dst_item = os.path.join(target_dir, item)
            # shutil.move会自动处理文件覆盖/目录合并的情况
            shutil.move(src_item, dst_item)
        
        # 删除空的原Person目录
        os.rmdir(person_path)

# 清理空的原类型目录(可选)
for type_name in os.listdir(root_dir):
    type_path = os.path.join(root_dir, type_name)
    if os.path.isdir(type_path) and not os.listdir(type_path):
        os.rmdir(type_path)

优势说明:

  • 跨平台,Windows上直接运行(只要安装了Python)
  • os.path自动适配不同系统的路径分隔符(/或\)
  • 能处理隐藏文件(Shell脚本的*默认不会匹配隐藏文件,Python的os.listdir会全部列出)

重要提醒!

在运行任何脚本之前,一定要先备份整个Dir目录!避免操作失误导致文件丢失。如果遇到重名文件,脚本默认会覆盖,如果你想保留重复文件,可以在代码里添加判断逻辑,比如给重复文件加后缀。

内容的提问来源于stack exchange,提问作者Jelle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:40:09