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

树莓派Linux系统下用Python3的os/shutil移动文件到U盘报错求助

跨设备移动文件报错的修复方案

问题根源

  1. 跨文件系统限制:本地目录和U盘属于不同文件系统(本地多为ext4,U盘常见FAT32/NTFS),Linux不允许跨文件系统创建硬链接,shutil.move默认先尝试硬链接,触发Errno 18错误。
  2. 路径拼接错误:原代码每次循环都修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:18:31