Назад | Перейти на главную страницу

Как показать доступные диски в системе Linux?

Если я бегу fdisk -l Я получаю вывод как:

Disk /dev/sda: 120.0 GB, 120034123776 bytes
255 heads, 63 sectors/track, 14593 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x0003ad9d

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1        1306    10490413+  83  Linux
/dev/sda2            1307        2612    10490445   83  Linux

Disk /dev/sdb: 120.0 GB, 120034123776 bytes
        255 heads, 63 sectors/track, 14593 cylinders
        Units = cylinders of 16065 * 512 = 8225280 bytes
        Disk identifier: 0x0003ad9d

       Device Boot      Start         End      Blocks   Id  System
    /dev/sdb1               1        1306    10490413+  83  Linux
    /dev/sdb2            1307        2612    10490445   83  Linux

Как я могу просто показать диски, доступные в системе, чтобы они могли иметь пробел между ними как:

/ Дев / СДА / Дев / SDB / Дев / SDC

Пытаться:

cat /proc/partitions

или

ls /dev/sd*

Это перечислит все доступные разделы!

Вы можете использовать каналы для перенаправления вывода

 fdisk -l | grep ^Disk | awk -F:  '{ print $1 }' |  awk -F" "  '{ print $2 }'
  • fisk -l: получить полный вывод на диск
  • grep Disk: отфильтровать строку, начинающуюся с Disk
  • awk -F: '{print $ 1}': получить первую часть, где разделителем является ":"
  • awk -F "" '{print $ 2}': получить вторую часть, в которой разделителем является пробел

Вот версия Perl:

fdisk -l | perl -n -e 'if (m{^Disk (\/.*):})  { print $1," "} END { print "\n"}'

печатает:

/dev/sda /dev/sdc 

При этом смонтированные разделы отображаются в виде списка, разделенного пробелами:

echo $(mount -t ext2,ext3 | cut -f1 -d' ')

Вы можете добавить другие типы файловых систем.

Вот несколько других альтернатив, если вы можете сделать определенные предположения (хотя мне нравится / proc / partitions, если вы фильтруете основные числа, чтобы не брать тома LVM и т. Д.)

Предполагая, что все ваши диски являются локальными (т.е. не SAN):

user@host [/home/q0px]
$ ls -l /dev/disk/by-path/
total 0
lrwxrwxrwx 1 root root 9 Dec  5 01:27 pci-0000:00:1f.1-ide-0:0 -> ../../hda

Если все ваши разделы имеют UUID (работает и для устройств SAN)

user@host [/home/q0px]
$ ls -l /dev/disk/by-uuid 
total 0
lrwxrwxrwx 1 root root 18 Dec  5 01:27 dc13d5cf-ba98-4339-99c5-0136177f7e22 -> ../../cciss/c0d0p1

Если у всех ваших разделов есть метки (также orks для устройств SAN):

user@host [/home/q0px]
$ ls -l /dev/disk/by-label/
total 0
lrwxrwxrwx 1 root root 18 Dec  5 01:27 boot -> ../../cciss/c0d0p1

Я думаю, что лучшим решением будет использовать только одну команду, например:

    awk '/[a-z]$/ {print $4}' /proc/partitions

или если у вас есть устройства md или dm и вы хотите отображать только диски sata (sdx):

    awk '$4 ~ /^sd.$/ { print $4 }' /proc/partitions

Также не так красиво, все еще однострочно, он использует больше команд, но работает:

    cat /proc/partitions | awk '{print $4}' | grep sd[a-z] | grep -v [0-9]

Только мои 2 цента ... Надеюсь, это поможет!

Я предполагаю, что такие команды, как тот, который использовался u, или df (который перечисляет устройства, показывая свободное и используемое пространство) не будут выводить данные в режиме, разделенном пробелами, как вы хотите. Вам нужно использовать команду обработки строк, такую ​​как sed 'piped', для вывода предыдущих дисковых команд и получить желаемый выход.

-ОБЪЯВЛЕНИЕ.