使用shutil.move移动目录时出现目录丢失的问题排查
问题排查与修复
核心问题分析
1. Sorted目录创建路径错误
你的代码中Path("Sorted").mkdir(exist_ok=True)是在脚本运行的当前工作目录创建Sorted目录,而非你指定的workingDir下。这直接导致了目录“消失”的问题:
当workingDir/Sorted不存在时,shutil.move(src, dst)的行为是将源目录重命名为目标路径,而非将源移入目标目录。第一次匹配到的目录(比如123-text)会被直接重命名为workingDir/Sorted,看起来像是“消失”了;第二次匹配的目录则会被正常移入这个刚生成的Sorted目录,最终你只会看到Sorted里有第二个目录,误以为第一个丢失了。
2. 路径拼接与遍历的隐患
- 手动用
+ '/'拼接路径,在Windows系统下会导致路径错误,且容易出错 os.listdir返回的是字符串,无法直接判断是否为目录,可能会误处理文件- 循环内重复创建Sorted目录(虽有
exist_ok=True,但没必要) - 未处理目录名不含
'-'的情况,会触发IndexError
修复后的代码
import shutil from pathlib import Path working_dir = Path(input("Paste the path to your files: ")) target_prefixes = {'123', '345', '678', '910'} # 集合查找效率更高 # 提前在指定工作目录下创建Sorted目录 sorted_dir = working_dir / "Sorted" sorted_dir.mkdir(exist_ok=True) # 遍历工作目录下的所有条目,仅处理目录 for item in working_dir.iterdir(): if item.name == '.DS_Store' or not item.is_dir(): continue # 仅分割第一个'-',避免目录名含多个'-'的情况 name_parts = item.name.split("-", 1) if len(name_parts) < 2: continue prefix = name_parts[0] if prefix in target_prefixes: # 明确指定目标路径,确保将目录移入Sorted shutil.move(str(item), str(sorted_dir / item.name))
关键修复点说明
- 正确创建Sorted目录:用
working_dir / "Sorted"确保目录创建在你指定的工作目录下,而非脚本运行目录 - 提前创建目录:避免循环内重复执行mkdir,逻辑更清晰
- 使用Path对象处理路径:自动适配不同系统的路径分隔符,避免手动拼接出错
- 增加安全判断:仅处理目录、跳过不含
'-'的目录,避免异常 - 明确移动目标:
sorted_dir / item.name确保将源目录移入Sorted,而非重命名为Sorted
内容的提问来源于stack exchange,提问作者Lew
相关产品推荐
相关产品推荐

