我们只想打印没有的磁盘文件系统通过命令行
从下面的示例中我们可以看到sde
磁盘没有文件系统
lsblk -o NAME,FSTYPE
NAME FSTYPE
sda
├─sda1 xfs
└─sda2 LVM2_member
├─vg-LV_root xfs
├─vg-LV_swap swap
├─vg-LV_var xfs
└─vg-LV_docker xfs
sdb ext4
sdc ext4
sdd ext4
sde
所以我们尝试以下命令来捕获没有 FS 的磁盘
lsblk -o NAME,FSTYPE | awk '$2 == "" { print $0 }'
我们得到
sda
sde
sda
正如我们从上面打印的磁盘中看到的那样,但sda
它是操作系统磁盘,因此命令行没有给出正确的输出
正确的输出应该是:
sde
有什么建议或其他方法可以提供正确的输出吗?
lsblk -oNAME,FSTYPE,FSTYPE --noheadings --nodeps
sda
sdb ext4 ext4
sdc ext4 ext4
sdd ext4 ext4
sde
答案1
我建议我们在方法中的lsblk中添加fdisk(以及一些简单的帮助工具)。以下 shellscript 在我的测试用例中有效,
#!/bin/bash
for i in $(lsblk -dno name|grep -v sr)
do
LANG=C
sudo fdisk -lu "/dev/$i" |
tr '\n' ' ' |
grep 'Disk ' |
grep -v 'Disklabel type:' |
grep -o "/dev/$i"
done
这标识了一个干净的驱动器(没有任何磁盘标签别名分区表)。
如果您希望查看带有分区表和分区的驱动器,但任何分区中都没有文件系统(也没有交换空间),请尝试以下 shellscript,它仅使用 lsblk(以及一些简单的帮助工具),
#!/bin/bash
for i in $(lsblk -dno name|grep -v sr)
do
LANG=C
echo -n "/dev/$i "
lsblk -lno fstype "/dev/$i" | tr '\n' ' '
echo ""
done | sed 's/ *$//' | grep -v '\ [a-z]*'
编辑:
如果您有时想查看 CD/DVD 驱动器,请|grep -v sr
从“for-line”中删除。这在第二种选择中效果很好(但在第一种选择中效果不佳,因为 fdisk 可以通过“fdisk:无法打开 /dev/sr0:找不到介质”将您从 do 循环中抛出)。
答案2
仅基于您问题中的输入/输出:
$ cat tst.awk
NF == 1 { hits[$1] }
/^[^[:alpha:]]/ { delete hits[prev] }
{ prev = $1 }
END {
for ( name in hits ) {
print name
}
}
$ cat file | awk -f tst.awk
sde
显然替换cat file
为lsblk -o NAME,FSTYPE
.
答案3
您还需要检查PTTYPE
,分区表不是文件系统。--no-deps
如果您只对磁盘感兴趣,您还可以使用删除所有子设备:
$ lsblk -oNAME,PTTYPE,FSTYPE --noheadings --nodeps | awk '$2 == "" && $3 == "" { print $0 }'
sdb
但这也取决于您对“没有文件系统的磁盘”的定义 - 正如我所说,分区表不是文件系统,因此您的命令给出了有效的结果,然后存在一个问题:带有分区表的磁盘是否具有分区是否为空。如果您希望返回带有分区表但没有分区的磁盘,则需要使用比lsblk
这更复杂的东西。