Überprüfen Sie, ob eine „Zeichenfolge“ ein vorhandener Gerätename und kein Partitionsname ist

Überprüfen Sie, ob eine „Zeichenfolge“ ein vorhandener Gerätename und kein Partitionsname ist

Wenn ich beispielsweise eine vorhandene Gerätevariable habe /dev/sda, möchte ich überprüfen, dass es sich nicht um den Namen einer Partition, sondern um den der gesamten Festplatte handelt.
Ich habe Folgendes versucht:

[[ $(df --output=source "$var" 2> /dev/null | tail -n 1) = 'udev' ]]

Dies gibt jedoch „true“ zurück, unabhängig davon, ob das var='/dev/sda'Gerät angeschlossen ist oder die var='/dev/sda1'Partition nicht gemountet ist.
Selbst wenn Sie die vorherige Bedingung mit der folgenden kombinieren:

if grep -sq "^$var " /proc/mounts; then ...

Es wäre nicht ausreichend zu sagen, dass es sich um einen Datenträgernamen und nicht um eine Datenträgerpartition handelt.

Wie kann ich überprüfen, ob es stringsich um einen vorhandenen Gerätenamen und nicht um einen Partitionsnamen handelt?

Antwort1

Sie könnten lsblkhierfür verwenden – insbesondere sollte entweder (für eine Partition) oder (für ein ganzes Blockgerät) lsblk -o typezurückgeben .partdisk

So beispielsweise gegeben:

$ lsblk /dev/sda
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 238.5G  0 disk
├─sda1   8:1    0   9.8G  0 part
├─sda2   8:2    0 164.7G  0 part
├─sda3   8:3    0  31.1G  0 part /
├─sda4   8:4    0     1K  0 part
├─sda5   8:5    0  15.3G  0 part /usr/local
└─sda6   8:6    0  17.7G  0 part /home

Dann

$ var=/dev/sda; lsblk -ndo type "$var" | grep -qF part && echo "is a partition"
$ var=/dev/sda1; lsblk -ndo type "$var" | grep -qF part && echo "is a partition"
is a partition

oder

$ var=/dev/sda; lsblk -ndo type "$var" | grep -qF disk && echo "is a disk"
is a disk
$ var=/dev/sda1; lsblk -ndo type "$var" | grep -qF disk && echo "is a disk"

Antwort2

Verwenden lsblk:

var="/dev/sda"

if lsblk "$var" &>/dev/null; then
   echo "Is a disk."
else
   echo "Is not a disk."
fi

Wenn "$var"es sich nicht um ein gültiges Gerät handelt, wird z. B. var="/dev/sda1"ein lsblkExit-Code ungleich Null ausgegeben.


So erhalten Sie die Ausgabe aller Geräte:

lsblk -dnp --output NAME

Antwort3

Verwenden mountpoint.

Aus man mountpoint:

NAME
       mountpoint - see if a directory or file is a mountpoint

SYNOPSIS
       mountpoint [-d|-q] directory | file

       mountpoint -x device

DESCRIPTION
       mountpoint   checks   whether   the   given   directory   or  file  is  mentioned  in  the
       /proc/self/mountinfo file.

verwandte Informationen