树莓派Linux系统下用Python3的os/shutil移动文件到U盘报错求助
跨设备移动文件报错的修复方案
问题根源
- 跨文件系统限制:本地目录和U盘属于不同文件系统(本地多为ext4,U盘常见FAT32/NTFS),Linux不允许跨文件系统创建硬链接,
shutil.move默认先尝试硬链接,触发Errno 18错误。 - 路径拼接错误:原代码每次循环都修改
new变量,导致第二次循环时目标路径变成/media/guardian/GUARDIANT1/New/img1.jpgimg2.jpg这种无效格式,进一步引发问题。
修复后的代码
import shutil import os original_dir = '/home/guardian/shared/TestPath/New/' target_root = '/media/guardian/GUARDIANT1/New/' # 确保目标根目录存在,不存在则自动创建 os.makedirs(target_root, exist_ok=True) for root, _, files in os.walk(original_dir): # 计算当前子目录相对于原根目录的路径,保持原目录结构 relative_path = os.path.relpath(root, original_dir) target_dir = os.path.join(target_root, relative_path) # 创建对应的目标子目录 os.makedirs(target_dir, exist_ok=True) for file in files: src_path = os.path.join(root, file) dst_path = os.path.join(target_dir, file) # shutil.move会自动处理跨设备场景:先复制文件到目标,再删除原文件 shutil.move(src_path, dst_path)
关键改动说明
- 固定目标根路径:不再循环修改目标路径变量,每次用
os.path.join生成正确的文件路径,避免路径错乱。 - 同步目录结构:用
os.path.relpath保留原目录的子结构,确保U盘中的文件布局和原目录一致。 - 自动创建目录:
os.makedirs(..., exist_ok=True)自动创建缺失的子目录,无需手动提前建文件夹。 - 跨设备自动适配:只要路径正确,
shutil.move检测到跨设备时,会自动切换为「复制+删除」模式,绕过硬链接限制。
额外提醒
- 检查U盘权限:用
ls -l /media/guardian/GUARDIANT1/确认guardian用户对U盘目录有读写权限。 - U盘格式限制:如果是FAT32格式,不支持4GB以上文件,且不区分文件名大小写,可能导致部分文件无法移动。
内容的提问来源于stack exchange,提问作者Jorge Augusto Wilchen
相关产品推荐
相关产品推荐

