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

如何可靠将Android文件安全传输至Windows PC并避免误删

安卓MP4自动传输安全方案

核心逻辑是只有完成传输完整性双重校验后,才会删除手机端源文件,从流程上避免传输失败误删素材。

前置准备

  • Windows端安装WSL或者Git Bash用于运行bash脚本,将adb所在路径加入系统环境变量,手机开启USB调试并给当前PC授权调试权限
  • 提前确认两个路径:手机端MP4的实际存储目录、外接SSD的挂载路径(WSL下路径格式为/mnt/盘符/目标文件夹,Git Bash下为/盘符/目标文件夹)

完整可直接用的脚本

#!/bin/bash
# 按需修改以下配置项
ANDROID_VIDEO_DIR="/sdcard/DCIM/Camera/"  # 手机端视频存放路径
LOCAL_SAVE_DIR="/mnt/e/Mobile_Videos/"   # 外接SSD存储路径
TMP_LIST="/tmp/android_mp4_todo.txt"
LOG_PATH="${LOCAL_SAVE_DIR}transfer_log_$(date +%Y%m%d).log"

# 初始化目录和日志
mkdir -p "$LOCAL_SAVE_DIR"
echo "=== 传输任务启动 $(date '+%Y-%m-%d %H:%M:%S') ===" > "$LOG_PATH"

# 获取手机端所有mp4文件列表
adb shell "find $ANDROID_VIDEO_DIR -name '*.mp4' -type f" | tr -d '\r' > "$TMP_LIST"
if [ ! -s "$TMP_LIST" ]; then
    echo "未找到待传输MP4文件,任务退出" >> "$LOG_PATH"
    rm -f "$TMP_LIST"
    exit 0
fi

# 逐个处理文件
while IFS= read -r remote_file; do
    filename=$(basename "$remote_file")
    local_file="${LOCAL_SAVE_DIR}${filename}"
    echo "正在处理: $filename" >> "$LOG_PATH"

    # 第一步:执行文件传输
    adb pull "$remote_file" "$local_file" >> "$LOG_PATH" 2>&1
    if [ $? -ne 0 ]; then
        echo "传输失败,跳过源文件删除: $filename" >> "$LOG_PATH"
        rm -f "$local_file"
        continue
    fi

    # 第二步:校验文件字节数,快速识别中断导致的不完整文件
    remote_size=$(adb shell "stat -c %s '$remote_file'" | tr -d '\r')
    local_size=$(stat -c %s "$local_file")
    if [ "$remote_size" != "$local_size" ]; then
        echo "大小不匹配(远端:$remote_size 本地:$local_size),跳过源文件删除: $filename" >> "$LOG_PATH"
        rm -f "$local_file"
        continue
    fi

    # 第三步:校验SHA256哈希,确保文件内容完全一致
    remote_sha=$(adb shell "sha256sum '$remote_file' | awk '{print \$1}'" | tr -d '\r')
    local_sha=$(sha256sum "$local_file" | awk '{print $1}')
    if [ "$remote_sha" != "$local_sha" ]; then
        echo "哈希校验不匹配,跳过源文件删除: $filename" >> "$LOG_PATH"
        rm -f "$local_file"
        continue
    fi

    # 所有校验通过,才删除手机端源文件
    echo "校验通过,删除手机端源文件: $filename" >> "$LOG_PATH"
    adb shell "rm -f '$remote_file'"

done < "$TMP_LIST"

rm -f "$TMP_LIST"
echo "=== 传输任务结束 $(date '+%Y-%m-%d %H:%M:%S') ===" >> "$LOG_PATH"

关键安全设计

  • 三层拦截机制:先判断adb pull命令本身的执行状态,再比对文件字节大小,最后做内容级的SHA256哈希校验,任意一步不通过都不会触发源文件删除
  • 自动清理坏文件:校验失败时会自动删除本地生成的不完整/损坏文件,不会占用SSD空间
  • 兼容特殊文件名:读取文件列表时做了格式处理,所有路径变量都加双引号包裹,文件名带空格、特殊符号也不会执行报错
  • 操作可追溯:所有传输、校验、删除操作都按日期生成日志存在SSD上,出问题可以随时回溯

使用提示

  • 首次使用建议先把脚本里删除远端文件的那行adb shell "rm -f '$remote_file'"注释掉,跑1-2次确认传输、校验逻辑符合预期,再放开删除权限
  • 如果用Git Bash运行时提示找不到adb,把脚本里的adb替换成adb.exe的完整绝对路径即可
  • 传输过程中不要拔插USB线、不要断开手机连接,外接SSD提前确保剩余空间足够存视频

内容的提问来源于stack exchange,提问作者Liam Vereecken

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 12:21:20