You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动