macOS恢复模式终端备份脚本:无依赖、保层级、避冲突的完整方案

macOS恢复模式终端备份脚本:无依赖、保层级、避冲突的完整方案


文章目录

  • macOS恢复模式终端备份脚本:无依赖、保层级、避冲突的完整方案
    • 一、恢复模式备份的核心痛点
    • 二、核心功能与实现逻辑
    • 三、关键技术点与解决方案
      • 1. 替代缺失命令:用纯bash实现`basename`功能
      • 2. 避免`eval`依赖:用数组传递`tar`排除参数
      • 3. 兼容bash 3.2:严格遵循原生语法
      • 4. 强化容错性:提前检查+失败处理
    • 四、最终完整脚本(可直接预置)
    • 五、恢复模式下的实操执行步骤(适配无复制粘贴环境)
      • 步骤1:提前预置脚本到外接备份磁盘(正常开机状态下操作)
      • 步骤2:恢复模式下挂载磁盘并执行脚本
    • 六、脚本常见问题与解决方案
      • 问题1:脚本执行报错「/bin/bash^M: bad interpreter: No such file or directory」
      • 问题2:报错「command not found」(针对`date`/`tar`/`find`等命令)
      • 问题3:打包目录时报错「No space left on device」
      • 问题4:报错「Permission denied」(权限不足)
      • 问题5:脚本执行无响应,无日志输出
    • 七、总结

当Mac因系统故障进入恢复模式时,终端是备份文件的核心工具。但恢复模式下的bash版本(通常为3.2)语法限制多、部分命令缺失(如basename/eval),同时外接磁盘空间有限、多目录备份易出现同名冲突——更关键的是,恢复模式无图形界面、无法访问网络,无法直接复制粘贴脚本内容,这些问题都让备份变得棘手。

本文将从实际踩坑经验出发,一步步构建完全适配恢复模式环境的备份脚本,实现「多目录批量备份+保留路径层级+排除指定目录+无外部命令依赖」的目标,同时提供「提前预置脚本」的实操流程和常见问题排查指南,附最终可直接运行的完整脚本。

一、恢复模式备份的核心痛点

在编写脚本前,需先明确恢复模式下的特殊限制:

  1. 命令缺失basenameeval等常用命令可能不存在,且环境变量不完整,需用绝对路径调用系统命令;
  2. bash版本低:bash 3.2不支持高级语法(如复合条件|| {}),函数定义/数组操作需严格遵循原生语法;
  3. 空间有限:外接备份磁盘容量不足,需提前检查空间,避免备份中途中断;
  4. 同名冲突:不同目录下的同名文件/目录易覆盖,需保留原路径层级;
  5. 无法复制粘贴:恢复模式无网络、无图形界面剪贴板,无法直接从网页复制脚本,需提前将脚本预置到备份磁盘。

二、核心功能与实现逻辑

我们需要实现的备份逻辑:

  • 多目录批量处理:支持同时备份多个分散的目录;
  • 保留路径层级:每个待备份目录的内容独立存放在备份盘的对应子目录下;
  • 自动区分文件/目录:文件直接复制(保留元数据),目录打包为tar.gz并排除指定目录(如.git/node_modules);
  • 容错性强化:跳过不存在的目录、清理打包失败的残缺文件、提前检查磁盘空间;
  • 适配无复制粘贴环境:支持提前预置脚本到备份磁盘,恢复模式下直接调用执行。

三、关键技术点与解决方案

针对恢复模式的限制,需对脚本做针对性适配:

1. 替代缺失命令:用纯bash实现basename功能

恢复模式中basename命令可能缺失,通过bash字符串截取实现路径最后一级的提取:

get_last_part(){localPATH_STR="$1"PATH_STR=${PATH_STR%/}# 去除末尾斜杠echo"${PATH_STR##*/}"# 截取最后一个斜杠后的内容}

2. 避免eval依赖:用数组传递tar排除参数

恢复模式无eval命令,通过数组传递参数替代字符串拼接,直接传递给tar

get_exclude_array(){localexclude_arr=()forDIRin".git""node_modules";doexclude_arr+=("--exclude=$DIR")doneecho"${exclude_arr[@]}"}# 调用示例localexclude_params=($(get_exclude_array))/usr/bin/tar zcfp"$TAR_FILE_PATH""${exclude_params[@]}""$SOURCE_ITEM"

3. 兼容bash 3.2:严格遵循原生语法

  • 函数定义需保证{前有空格,内部语句完整;
  • 避免复合语法(如|| {}),改用显式if/else判断;
  • 系统命令均用绝对路径(如/bin/date//usr/bin/tar)。

4. 强化容错性:提前检查+失败处理

  • 磁盘空间检查:备份前验证可用空间,预留2GB余量;
  • 残缺文件清理:打包失败时自动删除不完整的tar.gz文件;
  • 目录不存在处理:跳过不存在的待备份目录,不中断整体流程。

四、最终完整脚本(可直接预置)

以下是适配所有恢复模式限制的无依赖备份脚本,已整合所有功能,可直接预置到备份磁盘:

#!/bin/bash# 配置项(已适配实际场景)EXCLUDE_DIRS=(".git""node_modules")BACKUP_TARGET_ROOT="/Volumes/S1/MyBackup"SOURCE_DIRS=("/Volumes/data/projects""/Volumes/soft/repos")# 检查目录存在check_dir_exists(){localDIR="$1"if[!-d"$DIR"];thenecho"错误:目录不存在 -$DIR"return1fireturn0}# 检查磁盘空间check_disk_space(){localDIR="$1"localFREE_SPACE=$(/bin/df -k"$DIR"|/usr/bin/tail -1|/usr/bin/awk'{print $4}')localMIN_SPACE=$((2048*1024))if!/usr/bin/echo"$FREE_SPACE"|/usr/bin/grep -q'^[0-9]*$';thenecho"警告:无法获取磁盘空间,跳过检查"return0fiif["$FREE_SPACE"-lt"$MIN_SPACE"];thenecho"错误:空间不足!可用$((FREE_SPACE/1024))MB,需2GB"exit1fiecho"磁盘空间检查通过,可用$((FREE_SPACE/1024))MB"}# 替代basenameget_last_part(){localPATH_STR="$1"PATH_STR=${PATH_STR%/}echo"${PATH_STR##*/}"}# 构建排除参数数组get_exclude_array(){localexclude_arr=()forDIRin"${EXCLUDE_DIRS[@]}";doexclude_arr+=("--exclude=$DIR")doneecho"${exclude_arr[@]}"}# 处理单个备份项process_source_item(){localSOURCE_ITEM="$1"localPARENT_SOURCE_DIR="$2"localPARENT_DIR_NAME=$(get_last_part"$PARENT_SOURCE_DIR")localITEM_NAME=$(get_last_part"$SOURCE_ITEM")localTIMESTAMP=$(/bin/date +%Y%m%d_%H%M%S)localBACKUP_SUB_DIR="$BACKUP_TARGET_ROOT/$PARENT_DIR_NAME"/bin/mkdir -p"$BACKUP_SUB_DIR"||{echo" 无法创建子目录";return1;}if[-f"$SOURCE_ITEM"];thenecho" 复制文件:$ITEM_NAME"/bin/cp -p"$SOURCE_ITEM""$BACKUP_SUB_DIR/"[$?-eq0]&&echo" 成功:$PARENT_DIR_NAME/$ITEM_NAME"||echo" 失败"elif[-d"$SOURCE_ITEM"];thenlocalTAR_FILE_NAME="${ITEM_NAME}_${TIMESTAMP}.tar.gz"localTAR_FILE_PATH="$BACKUP_SUB_DIR/$TAR_FILE_NAME"localexclude_params=($(get_exclude_array))echo" 打包目录:$ITEM_NAME->$TAR_FILE_NAME"/usr/bin/tar zcfp"$TAR_FILE_PATH""${exclude_params[@]}""$SOURCE_ITEM"if[$?-eq0];thenecho" 成功:$PARENT_DIR_NAME/$TAR_FILE_NAME"else[-f"$TAR_FILE_PATH"]&&/bin/rm -f"$TAR_FILE_PATH"echo" 失败"fielseecho" 跳过不支持的类型:$ITEM_NAME"fi}# 主流程echo"========================================"echo"macOS恢复模式备份脚本(最终版)"echo"执行时间:$(/bin/date"+%Y-%m-%d %H:%M:%S")"echo"备份目标:$BACKUP_TARGET_ROOT"echo"========================================"if!check_dir_exists"$BACKUP_TARGET_ROOT";thenecho"创建备份根目录:$BACKUP_TARGET_ROOT"/bin/mkdir -p"$BACKUP_TARGET_ROOT"||{echo"创建失败";exit1;}ficheck_disk_space"$BACKUP_TARGET_ROOT"localSOURCE_DIRforSOURCE_DIRin"${SOURCE_DIRS[@]}";doecho"----------------------------------------"if!check_dir_exists"$SOURCE_DIR";thenecho"跳过不存在的目录:$SOURCE_DIR"continuefilocalDIR_NAME=$(get_last_part"$SOURCE_DIR")echo"处理目录:$SOURCE_DIR"echo"备份层级:$BACKUP_TARGET_ROOT/$DIR_NAME"echo"----------------------------------------"/usr/bin/find"$SOURCE_DIR"-maxdepth1-mindepth1|whileread-r ITEM;doprocess_source_item"$ITEM""$SOURCE_DIR"donedoneecho"========================================"echo"备份完成!路径:$BACKUP_TARGET_ROOT"echo"========================================"exit0

五、恢复模式下的实操执行步骤(适配无复制粘贴环境)

由于macOS恢复模式无网络访问、无图形界面剪贴板,无法直接复制粘贴脚本,需采用「提前预置脚本到备份磁盘」的方案,具体步骤如下:

步骤1:提前预置脚本到外接备份磁盘(正常开机状态下操作)

  1. 正常启动Mac,将外接备份磁盘(如S1)连接到电脑,确保磁盘为可写格式(APFS/ExFAT,避免NTFS只读);
  2. 打开「终端」,输入nano /Volumes/S1/backup_final.sh(直接在备份磁盘根目录创建脚本);
  3. 将上述完整脚本粘贴到nano编辑器中,按需修改BACKUP_TARGET_ROOT(已默认适配/Volumes/S1/MyBackup);
  4. Ctrl+O保存,Enter确认文件名,Ctrl+X退出nano;
  5. 赋予脚本执行权限:输入chmod +x /Volumes/S1/backup_final.sh
  6. 安全弹出外接备份磁盘,备用(确保脚本已成功存储在磁盘中)。

步骤2:恢复模式下挂载磁盘并执行脚本

  1. 关闭故障Mac,进入恢复模式:
    • 搭载Apple芯片(M1/M2等):按住电源键直到出现「加载启动选项」,选择「选项」→「继续」;
    • 搭载Intel芯片:开机时按住Command (⌘) + R直到出现Apple标志;
  2. 恢复模式启动后,打开「磁盘工具」,找到外接备份磁盘(如S1),点击右上角「挂载」(若显示「已锁定」,先点击「解锁」并输入磁盘密码);
  3. 关闭「磁盘工具」,打开「实用工具」→「终端」;
  4. 切换到备份磁盘根目录:输入cd /Volumes/S1(对应你的备份磁盘名称,可通过ls /Volumes查看所有挂载磁盘);
  5. 验证脚本是否存在:输入ls,确认能看到backup_final.sh文件;
  6. 执行备份脚本:输入./backup_final.sh(或绝对路径/Volumes/S1/backup_final.sh,避免路径问题);
  7. 等待脚本执行完毕(大型目录如docker/k8s打包时间较长),执行完成后终端会提示「备份完成」;
  8. 安全弹出备份磁盘:输入diskutil unmount /Volumes/S1,即可移除磁盘完成备份。

六、脚本常见问题与解决方案

在实操过程中,容易遇到以下问题,针对性解决方案如下:

问题1:脚本执行报错「/bin/bash^M: bad interpreter: No such file or directory」

  • 原因:脚本在Windows编辑器中编辑过,引入了Windows换行符(^M,即\r),macOS bash无法识别;
  • 解决方案:在恢复模式终端中清理Windows换行符,命令如下:
    # 进入脚本所在目录(如/Volumes/S1)cd/Volumes/S1# 清理换行符并生成新脚本(backup_fixed.sh)tr-d'\r'<backup_final.sh>backup_fixed.sh# 赋予新脚本执行权限chmod+x backup_fixed.sh# 执行新脚本./backup_fixed.sh
  • 预防措施:仅在macOS终端(nano/vim)或Mac原生文本编辑器(如TextEdit,需切换为「纯文本模式」)中编辑脚本,避免使用Windows编辑器(如Notepad++、Word)。

问题2:报错「command not found」(针对date/tar/find等命令)

  • 原因:恢复模式环境变量缺失,直接调用命令无法找到路径,或命令本身未安装(恢复模式下原生命令均存在,多为路径问题);
  • 解决方案:使用命令的绝对路径替代直接调用,脚本中已默认适配,手动修改时参考:
    • date/bin/date
    • tar/usr/bin/tar
    • find/usr/bin/find
    • cp/bin/cp
  • 验证方法:输入which 命令名(如which tar),可查看命令的绝对路径。

问题3:打包目录时报错「No space left on device」

  • 原因:备份磁盘可用空间不足,无法存储打包后的压缩文件;
  • 解决方案
    1. 优先分批备份:删除脚本中SOURCE_DIRS数组里的大型目录(如docker/k8s),先备份小型目录,清理磁盘后再备份大型目录;
    2. 清理备份磁盘:删除磁盘中无用的文件,释放至少2GB以上可用空间;
    3. 更换大容量备份磁盘:换用更大容量的外接磁盘,重新预置脚本并执行。

问题4:报错「Permission denied」(权限不足)

  • 原因:备份磁盘为只读格式(如NTFS,macOS默认不支持NTFS写入),或待备份目录未解锁(系统盘);
  • 解决方案
    1. 备份磁盘问题:更换为APFS/ExFAT格式的磁盘(可在正常开机状态下通过「磁盘工具」格式化);
    2. 系统盘解锁问题:在「磁盘工具」中选中系统盘(如Macintosh HD),点击「解锁」,输入Mac登录密码,确保系统盘挂载为可写模式。

问题5:脚本执行无响应,无日志输出

  • 原因:正在处理大型文件/目录(如docker镜像),tar打包需要大量时间,恢复模式终端无实时进度条;
  • 解决方案
    1. 耐心等待:不要中断脚本执行,可通过「磁盘工具」查看备份磁盘的空间使用情况(是否在持续占用);
    2. 验证脚本运行状态:新开一个终端窗口,输入ps aux | grep backup_final.sh,确认脚本进程是否在运行;
    3. 后续优化:分批备份大型目录,避免单次处理过大文件。

七、总结

本文的备份脚本完全适配macOS恢复模式的bash 3.2环境,解决了命令缺失、语法限制、无复制粘贴等核心痛点,同时提供了详细的「提前预置脚本」实操流程和常见问题排查指南。无论是系统故障后的应急备份,还是日常恢复模式下的文件迁移,都能通过该脚本高效、安全地完成任务,备份结果保留原目录层级,无同名冲突,便于后续系统恢复后的文件还原。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1140986.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【图像传输】基于matlab GUI格雷码编码MPSK图像传输系统【含Matlab源码 14896期】含报告

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到海神之光博客之家&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49…

【图像加密】基于matlab DNA结合arnold置乱变换实现彩色图像加密解密【含Matlab源码 14897期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到海神之光博客之家&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49…

【图像传输】格雷码编码MPSK图像传输系统【含GUI Matlab源码 14896期】含报告

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;Matlab武动乾坤博客之家&#x1f49e;…

TDengine Python 连接器入门指南

TDengine Python 连接器入门指南 本文面向 TDengine 初学者&#xff0c;目标是让你在 5&#xff5e;10 分钟内完成&#xff1a;安装连接器 → 建立连接 → 建库建表 → 写入 → 查询&#xff0c;并掌握连接器的基本使用方式与常见问题排查。 说明&#xff1a;TDengine 官方 Py…

基于Simulink的微电网中储能主控单元协调运行仿真

目录 手把手教你学Simulink 一、引言:为什么微电网需要“储能主控单元”? 二、系统整体架构 控制角色分配: 三、理论基础:下垂控制(Droop Control) 1. 有功-频率下垂(P-f) 2. 无功-电压下垂(Q-V) 四、Simulink 建模全流程 步骤1:主电路搭建(Simscape Elec…

Qt OpenGL 生成Mipmap技术详解

Qt OpenGL 生成Mipmap技术详解1. Mipmap技术概述1.1 Mipmap金字塔结构1.2 Mipmap的优势2. Qt中生成Mipmap的实现2.1 基本方法2.2 参数详解3. 高级应用技巧3.1 自定义Mipmap生成3.2 性能优化技巧4. 实际应用案例4.1 3D地形渲染4.2 2D游戏中的精灵渲染5. 常见问题解答5.1 Mipmap会…

【图像加密】DNA结合arnold置乱变换实现彩色图像加密解密【含Matlab源码 14897期】

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;Matlab武动乾坤博客之家&#x1f49e;…

【图像加密】混沌系统和DNA编码图像加密解密【含Matlab源码 14898期】含论文

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;Matlab武动乾坤博客之家&#x1f49e;…

情感分析在广告效果评估中的创新应用

情感分析在广告效果评估中的创新应用关键词&#xff1a;情感分析、广告效果评估、创新应用、自然语言处理、数据挖掘摘要&#xff1a;本文聚焦于情感分析在广告效果评估中的创新应用。首先介绍了情感分析和广告效果评估的基本概念&#xff0c;阐述了将二者结合的背景和意义。接…

导师不会告诉你:8款免费AI论文工具,轻松搞定真实参考文献!

警告&#xff1a; 这篇内容可能会颠覆你对“写论文”这件事的认知。你的同学和学长姐&#xff0c;可能正在用这些工具悄悄“开挂”。如果不想在Deadline前通宵达旦、反复被导师打回重改&#xff0c;请务必认真读完。 你是不是也有过这样的经历&#xff1f;面对空白的Word文档&a…

2026零基础小白能不能转行AI大模型?不会代码不懂编程?这一篇文章让你搞明白!

前几天一个硕士期间搞材料的朋友&#xff0c;考上了某大学的人工智能博士&#xff0c;有点焦虑&#xff0c;我们聊了聊。 他焦虑的重点主要集中在硕士期间一直在做材料相关的课题&#xff0c;编程基础薄弱&#xff0c;参与的人工智能课题少&#xff0c;担心读了博士之后&#…

痛定思痛:我花了一个月重构 AI 助手,只为了解决这三个问题

写在前面 说实话&#xff0c;第一次用官方 Claude Code 的时候&#xff0c;我是真兴奋。终端里跑着 AI&#xff0c;能帮我改代码、跑命令&#xff0c;感觉像有了个 24 小时在线的高级工程师搭档。 但用了两周后&#xff0c;我开始纠结。 为什么每次切换模型都要重启会话&…

异地就医备案-须知内容

1、适用人群 (1)异地长期居住人员,包括异地安置退休人员、异地长期居住人员、常驻异地工作人员等长期在异地居住、生活、工作的人员。 (2)临时外出就医人员,包括异地转诊就医人员,因工作、旅游等原因异地急诊抢救人员以及其他临时外出就医人员。 2、备案材料 (1)异…

基于SpringBoot的拼装模型销售管理系统的设计与实现(源码+lw+部署文档+讲解等)

课题介绍 随着拼装模型爱好者群体不断扩大&#xff0c;模型销售市场规模持续增长&#xff0c;但当前拼装模型销售行业普遍存在商品品类繁杂难管理、订单处理效率低下、库存管控不精准、客户需求响应滞后等问题&#xff0c;制约了商家运营效率与用户购物体验的提升。本课题以搭建…

SAP UI5 概念辨析:namespace,library 和 module 的理解

本文笔者从接到教程学习者的一个实际问题开始。 这位朋友想使用 URLHelper 的 redirect 功能,在 SAP UI5 应用里进行页面跳转。 他查询 SAP UI5 帮助文档,看到了这个 redirect 方法的输入参数说明: 然后看到这个 URLHelper 抬头区域的三个字段: 类型为 namespace libra…

基于SpringBoot的陪诊服务平台系统(源码+lw+部署文档+讲解等)

课题介绍随着人口老龄化加剧、医疗资源分布不均衡&#xff0c;独居老人、行动不便者、异地就医人群等普遍面临就医流程繁琐、无人陪同协助的困境&#xff0c;陪诊服务需求持续增长&#xff0c;但当前陪诊市场存在服务标准不统一、供需对接低效、服务过程缺乏监管、资金结算不规…

基于SpringBoot的农村客运服务系统(源码+lw+部署文档+讲解等)

课题介绍随着乡村振兴战略深入推进&#xff0c;农村地区出行需求持续增长&#xff0c;但当前农村客运普遍存在线路规划不合理、班次信息不透明、票务管理滞后、运营监管低效等问题&#xff0c;制约了客运服务质量提升&#xff0c;难以满足群众便捷出行需求。本课题以优化农村客…

关系系统架构升级指南:从“好友模式”到“心动模式”的平滑迁移

资深后端工程师李峰在连续三周为“相亲对象”调试代码、优化简历、提供职场解决方案后&#xff0c;收到了对方诚挚的感谢&#xff1a;“你真是我见过最靠谱的技术伙伴&#xff01;”——这个评价比线上系统的致命Bug更让他无从排查。一、系统诊断&#xff1a;为何你的情感进程总…

基于SpringBoot的农村留守儿童援助信息系统(源码+lw+部署文档+讲解等)

课题介绍随着乡村振兴战略推进&#xff0c;农村留守儿童关爱援助工作愈发重要&#xff0c;但当前援助工作普遍存在留守儿童信息分散、援助资源对接不畅、帮扶过程缺乏动态跟踪、监管反馈机制不完善等问题&#xff0c;制约了援助服务的精准性与实效性。本课题以搭建高效协同的援…

基于SpringBoot的社区物资交易互助平台毕业设计

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。一、研究目的本研究旨在构建一个基于SpringBoot框架的社区物资交易互助平台&#xff0c;以实现社区内物资的有效流通和共享&#xff0c;提高社区成员的生活质量。具体研究目的…