Shell脚本中NVMe与普通硬盘的通用格式化及擦除方案问询
Shell脚本中NVMe与普通硬盘的通用格式化及擦除方案问询
嘿,这个需求太常见啦!完全不用写两个分开的脚本,咱们可以通过自动识别硬盘设备或者让脚本接受参数的方式,搞出一个通用版的脚本出来。我给你分享两个实用的思路:
思路一:自动检测目标硬盘(适合批量处理相同配置机器)
这个方案会自动识别系统里的第一个可用物理硬盘(排除虚拟盘、内存盘这类非物理存储),不管是NVMe还是普通SATA盘,都能自动适配执行命令。
完整脚本如下:
#!/bin/bash # 重要警告!此操作会彻底清除硬盘所有数据,请务必谨慎! echo "⚠️ 警告:即将执行硬盘格式化与擦除操作,目标硬盘的所有数据都会被永久清除!" read -p "请确认是否继续?(输入y/Y确认,其他键取消): " CONFIRM if [[ $CONFIRM != "y" && $CONFIRM != "Y" ]]; then echo "操作已取消。" exit 0 fi # 自动获取第一个非虚拟的物理硬盘设备 # 通过lsblk过滤出类型为disk的设备,排除loop虚拟盘,取第一个的路径 TARGET_DISK=$(lsblk -d -n -o PATH,TYPE | grep -E 'disk' | grep -v 'loop' | head -n 1 | awk '{print $1}') # 检查是否检测到硬盘 if [[ -z $TARGET_DISK ]]; then echo "❌ 未检测到可用的物理硬盘设备。" exit 1 fi echo "✅ 检测到目标硬盘:$TARGET_DISK" # 执行格式化命令 echo "🔧 正在执行格式化操作..." sudo mkfs -F "$TARGET_DISK" # 执行擦除命令 echo "🔧 正在执行硬盘擦除操作..." sudo scrub "$TARGET_DISK" echo "🎉 所有操作已完成!"
注意事项:
- 如果你的机器上有多个物理硬盘,脚本默认会选第一个,如果需要指定其他硬盘,可以修改
head -n 1的数字,或者调整过滤规则 - 脚本里的过滤逻辑已经排除了loop虚拟盘,但如果你的系统有其他特殊块设备,可能需要额外添加排除规则
- 如果目标硬盘是当前系统的启动盘,执行后系统会无法启动,所以一定要确认目标设备!
思路二:手动指定硬盘设备(适合精确控制场景)
如果你不想让脚本自动判断,而是想手动指定要操作的硬盘(比如机器上有多个盘,怕误操作),可以让脚本接受一个设备路径参数,这样通用性更强。
脚本示例:
#!/bin/bash # 检查是否传入了设备参数 if [[ $# -ne 1 ]]; then echo "用法:$0 <硬盘设备路径>" echo "示例:$0 /dev/nvme0n1 或者 $0 /dev/sda" exit 1 fi TARGET_DISK="$1" # 检查设备是否存在 if [[ ! -b $TARGET_DISK ]]; then echo "❌ 错误:设备 $TARGET_DISK 不存在!" exit 1 fi # 二次确认 echo "⚠️ 警告:即将格式化并擦除 $TARGET_DISK 的所有数据!" read -p "确认继续?(输入y/Y确认,其他键取消): " CONFIRM if [[ $CONFIRM != "y" && $CONFIRM != "Y" ]]; then echo "操作已取消。" exit 0 fi # 执行格式化与擦除 sudo mkfs -F "$TARGET_DISK" sudo scrub "$TARGET_DISK" echo "🎉 操作完成!"
使用方式:
比如要操作NVMe盘,就运行:./disk-wipe.sh /dev/nvme0n1;要操作普通SATA盘,就运行:./disk-wipe.sh /dev/sda,完全不用修改脚本内容。
两种方案各有优势:自动检测适合批量处理配置一致的笔记本,手动指定则更灵活安全,你可以根据自己的实际需求选!
备注:内容来源于stack exchange,提问作者user1737015




