MacOS下pathlib与shutil.move无法移动文件至已存在子文件夹
问题解决思路及修复代码
你的问题主要由两个核心原因导致:Mac系统下的.DS_Store隐藏文件会被遍历处理,干扰正常逻辑;另外Mac文件系统是大小写敏感的(Windows不敏感),字符串处理后可能存在空格、大小写差异,导致匹配失败。同时要先确认目标路径dest是Mac下的有效绝对路径。
具体修复步骤
- 过滤
.DS_Store和非PDF文件,只处理目标格式文件 - 增强字符串处理,确保得到的文件夹名无多余空格、大小写统一(可根据实际子文件夹名调整大小写规则)
- 增加目录有效性判断,避免同名文件干扰匹配
修复后的代码
import shutil from pathlib import Path source = '/Users/miram/Library/CloudStorage/OneDrive-Company/Docs/Test_SRCDirectory' # 务必确认dest是Mac下的绝对路径,比如外接硬盘路径可能是/Volumes/硬盘名/MAIN/Building-D1D-RFS2 dest = '/MAIN/Building-D1D-RFS2' fileword_target = "CRATE" for file in Path(source).iterdir(): # 跳过.DS_Store和非PDF文件 if file.name == '.DS_Store' or not file.suffix.lower() == '.pdf': continue # 处理文件名,去除多余空格并统一大小写(子文件夹是大写就改用upper()) target_folder_name = file.stem.split(fileword_target)[0].strip().lower() subdir = Path(dest, target_folder_name) # 调试输出,方便核对匹配的文件夹名和路径 print(f"处理文件:{file.name} | 匹配文件夹名:{target_folder_name} | 检查路径:{subdir}") if subdir.exists() and subdir.is_dir(): destination = Path(subdir, file.name) shutil.move(file, destination) print(f"文件已移动至:{destination}") else: print(f"未找到匹配文件夹:{target_folder_name}")
额外排查建议
- 打开终端执行
ls -la /MAIN/Building-D1D-RFS2(替换为你的实际dest路径),确认子文件夹名称和代码中输出的target_folder_name完全一致(包括空格、大小写) - 检查
dest路径是否正确:Mac下根目录开头为/,用户目录下的路径需写全,比如/Users/你的用户名/MAIN/...
内容的提问来源于stack exchange,提问作者MiraM
相关产品推荐
相关产品推荐

