如何可靠将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
相关产品推荐
相关产品推荐

