Для блочного устройства, как определить, должны ли имена разделов содержать «p»?

Вы можете проверить слова, которые появляются в обеих строках:

$ comm -12 <(sed 's/ /\n/g' <<<$str1 | sort) <(sed 's/ /\n/g' <<<$str2 | sort )
30
alanine

Пояснение

  • Команда comm сравнивает файлы. С флагами -1 и -2 он будет печатать те строки, которые находятся в обоих файлах.

  • sed 's / / \ n / g' : это просто заменяет все пробелы на новые строки в $ str1 , выводит на стандартный вывод, который затем передается через sort , потому что comm нуждается в своих входных файлах быть отсортированным. Подробнее о формате см. Bash: Here Strings .

  • Формат называется подстановкой процесса, подробнее об этом здесь .

Конечным результатом приведенной выше команды будет список всех слов, которые встречаются в обеих строках.

2
15.02.2019, 16:38
2 ответа

Если имя устройства заканчивается цифрой, то ядро ​​добавляет символ 'p', чтобы отделить номер раздела от имени устройства.

/dev/sda -> /dev/sda1
/dev/mmcblk0 -> /dev/mmcblk0p1

Подробнее см. disk_nameфункция в исходных кодах ядра Linux (linux/block/partition -generic.c):

if (isdigit(hd->disk_name[strlen(hd->disk_name)-1]))
    snprintf(buf, BDEVNAME_SIZE, "%sp%d", hd->disk_name, partno);
else
    snprintf(buf, BDEVNAME_SIZE, "%s%d", hd->disk_name, partno)
10
27.01.2020, 21:53

Вот что может быть полезно или не полезно в этом стремлении:

# Try to figure out if partition names are separated by "p" from the device name or not.
# The following cases imply a "p"
# - If the device name starts with mmcblk (common drivers for SD card readers)
# - If there is no device/type file for the respective device in /sys/class/block (e.g., NVME drives)
# - If the respective device/type indicates "0" (hard disks)
base_dev=$(basename "$sd_dev")
if [[ "$base_dev" =~ mmcblk[0-9]+ || \
      ! -e "/sys/class/block/${base_dev}/device/type" || \
      $(cat "/sys/class/block/${base_dev}/device/type") != 0 \
    ]]; then
    part_sep="p"
else
    part_sep=""
fi
0
27.01.2020, 21:53

Теги

Похожие вопросы