lsblk
如果你想从lsblk
获取分区信息:
lsblk -n -o NAME,TYPE,FSTYPE,PTTYPE
如果你想知道一个顶级块设备是否被分区,你可以检查分区类型,并限制结果以跳过依赖设备(例如,只显示/dev/sda,忽略/dev/sda1、/dev/sda2等)。
例如:
$ lsblk -nd -o PTTYPE /dev/sda
gpt
$ lsblk -nd -o PTTYPE /dev/sdd
$ lsblk -nd -o PTTYPE /dev/sdf
lsblk: /dev/sdf: not a block device
$ echo $?
32
使用
lsblk
命令来确定磁盘是否有分区表。
$ cat test.sh
partitioned() {
local DISK="$1"
local PARTITION_CHECK
if PARTITION_CHECK=$(lsblk -nd -o PTTYPE "$DISK" 2> /dev/null)
then
if [ -z "$PARTITION_CHECK" ]
then
echo "${DISK}: Not partitioned"
elif [ -n "$PARTITION_CHECK" ]
then
echo "${DISK}: Partitioned"
fi
else
echo "${DISK}: Could not determine partition status"
fi
}
for DISK in /dev/sda /dev/sdc /dev/sdf test
do
partitioned "$DISK"
echo
done
$ ./test.sh
/dev/sda: Partitioned
/dev/sdc: Not partitioned
/dev/sdf: Could not determine partition status
test: Could not determine partition status
partx
你也可以尝试使用partx
命令,如果存在分区表,它将返回零,如果不存在,则返回非零值。请注意,它还会因为一系列其他原因(权限不足、设备不存在等)返回非零值,这会使得判断设备是否未分区变得复杂:
$ sudo partx /dev/sda
NR START END SECTORS SIZE NAME UUID
1 227328 62916574 62689247 29.9G a123bcf4-5678-912d-d345-6b78f90g1234
$ echo $?
0
$ sudo partx /dev/sdd
partx: /dev/sdd: failed to read partition table
$ echo $?
1
$ sudo partx /dev/sdc
partx: stat of /dev/sdc failed: No such file or directory
$ echo $?
1
注意:`lsblk`似乎无法提供WSL虚拟文件系统的文件系统或分区类型信息。即使`df -T`显示了文件系统类型,它也会输出一个空行。
如果您需要查看关于WSL虚拟磁盘的一些信息,`parted`可能会有所帮助(注意:需要`sudo`权限)。
$ DEV=/dev/sda; sudo parted -ms "$DEV" print 2>/dev/null | grep "$DEV" | cut -d: -f 6
loop
$ DEV=/dev/sda; sudo parted -ms "$DEV" print 2>/dev/null | grep "$DEV" | cut -d: -f 6
gpt
$ DEV=/dev/sdd; sudo parted -ms "$DEV" print 2>/dev/null | grep "$DEV" | cut -d: -f 6
unknown
$ DEV=/dev/sdc; sudo parted -ms "$DEV" print 2>/dev/null | grep "$DEV" | cut -d: -f 6
sfdisk -d
生成的格式有点容易解析,但仍不理想。如果您已安装kpartx -l
,那么它在这方面甚至更好。可能还有其他实用程序。 - twalbergsfdisk
抱怨 GPT 标签。要求我改用parted
。 - Felipe Alvarez