我运行了这个命令来查看有哪些磁盘:
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"