#!/bin/ash # Get all partitions with given id (list of /dev/sdXX) # Works for MBR/DOS by looking at the type (1 byte) # and for GPT by looking for the label 'OpenSLX-ID$1' # in case an id was given, or with the given UUID, # or with the given name. # The output will be a list of matching devices, # sorted from largest to smallest. dev_find_partitions() { local ID dev exp target exp= # target for the scan, defaults to /dev to check everything if [ -b "$1" ]; then target="$1" shift elif [ -d "$1" ]; then target="$1/" else target="/dev/" fi while [ "$#" -gt 0 ]; do ID="$1" shift [ -z "$ID" ] && continue # if single digit, e.g. 7, look for 0x7 and 0x07 if regex_imatch "$ID" "^[0-9a-f]$"; then ID="0?$ID" fi if regex_imatch "$ID" "^[0-9a-f?]{2,3}$"; then # Match two digit and the expanded three digit version from above # if double digit look for MBR types and OpenSLX-ID$ID GPT labels exp="$exp|ID_PART_ENTRY_(NAME=OpenSLX-ID|TYPE=0x)$ID" elif regex_imatch "$ID" "^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$"; then # if UUID, look for TYPE exp="$exp|ID_PART_ENTRY_TYPE=$ID" else # something else, look for names of partitions / filesystems ID="$( regex_escape "$ID" )" exp="$exp|ID_(PART_ENTRY_NAME|FS_LABEL)=$ID" fi done exp="${exp:1}" for dev in $(find $target* -type b); do udevadm info --name="$dev" | grep -iqE "($exp)\$" \ && printf "%s\n" "$(blockdev --getsize64 "$dev") $dev" done | sort -n -k1 -r | cut -d' ' -f2 }