如何获取未安装/未格式化的磁盘的名称并将其格式化?

如何获取未安装/未格式化的磁盘的名称并将其格式化?

我运行了这个命令来查看有哪些磁盘:

sudo lsblk -o NAME,HCTL,SIZE,MOUNTPOINT | grep -i "sd"

结果是:

sda     1:0:1:0      680G 
└─sda1               680G /mnt
sdb     3:0:0:0        1T 
sdc     0:0:0:0      512G 
├─sdc1             511.9G /
├─sdc14                4M 
└─sdc15              106M /boot/efi

从这里我可以看出 sdb 就是我想要的。然后我将在该分区上创建一个分区,但首先我需要将其名称放入变量中,以便在下一步中使用。

当我部署这台虚拟机时,似乎 sdb 并不总是我需要的,有时是 sda,所以我希望有一种方法可以自动化这一过程。

有什么脚本可以帮助我吗?

谢谢

答案1

我们首先删除 ASCII 艺术,只获取sd_线条的一部分:

$ sudo lsblk -o NAME,HCTL,SIZE,MOUNTPOINT | grep -o sd.
sda
sda
sdb
sdc
sdc
sdc
sdc

然后使用以下命令删除多次出现的行uniq -u

$ sudo lsblk -o NAME,HCTL,SIZE,MOUNTPOINT | grep -o sd. | uniq -q
sdb

这可能不是最可靠的方法,但它可以完成工作:)

请注意,可能会返回多个结果。您可以添加结果head -1以仅获取第一个结果。

答案2

虽然 gronostaj 的答案确实解决了这个问题,但可能还有其他方法可以完成此操作,但我们需要安装 jq(apt-get install jq -y),之后脚本将如下所示:

echo $(lsblk --fs --json | jq -r '.blockdevices[] | select(.children == null and .fstype == null) | .name'| grep -i "sd")

在这种情况下的结果是:sdb 如预期的那样。

祝您编码愉快。

答案3

我建议编写一个脚本来检查lsblk输出的最后一列 - 对于所有已安装的分区,您都有一个挂载点列在那里。因此,如果磁盘上至少有一个已安装的分区,则您对该磁盘不感兴趣。只有当根本没有挂载点时,这才可能是您想要的磁盘。我猜它可以很容易地使用例如 perl 进行编码。

答案4

对于那些lsblk不支持--json标志的版本(我的是lsblk from util-linux 2.23.2),您可以使用以下代码片段:

DEVICES=$(lsblk --noheadings -o NAME | grep "^[a-zA-Z]" | grep -v $ROOT_DEVICE)
for d in $DEVICES; do
    if [ $(lsblk --noheadings -o NAME| grep $d | wc -l) -eq 1 ]; then
        DEVICE=$d;
        break;
    fi;
done
echo "Device: $DEVICE"

相关内容