求助:实现递归调换子目录层级结构的脚本方案
我完全懂你这种被目录结构调整+空格路径坑到的痛苦!刚好我之前处理过类似的需求,给你两个实用的方案,不管你习惯用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
相关产品推荐
相关产品推荐

