#!/bin/bash set -e declare -a devices populate_devices() { for devsys in /sys/class/block/sd*; do case $(readlink $devsys) in */devices/*/usb*/*/block/sd*[a-z]);; # Skip non removable devices (/removable in sys is not reliable # for usb3 disks). My definition of a removable device in this # script is usb devices for now. *) continue;; esac dev=${devsys##/sys/class/block/} if [ -e /sys/class/block/$dev/${dev}1 ]; then for subdev in /sys/class/block/$dev/${dev}*; do subdev=${subdev##/sys/class/block/$dev/} if ! mount | grep -q "^/dev/$subdev on /media/"; then devices+=($subdev) fi done else if ! mount | grep -q "^/dev/$dev on /media/"; then devices+=($dev) fi fi done } get_label() { dev=$1 for label in /dev/disk/by-label/*; do label=${label##*/} devfound=$(readlink /dev/disk/by-label/$label) devfound=${devfound##*/} if [ "$devfound" == "$dev" ]; then echo $label return fi done echo $dev } choose_device() { echo "List of mountable devices (${#devices[*]}):" format=" %-8s %s\n" printf "$format" =Device= =Label= for dev in ${devices[*]}; do printf "$format" $dev "$(get_label $dev)" done select choice in ${devices[@]}; do REPLY=$((REPLY-1)) break done } if [ "$#" -eq 0 ]; then populate_devices if [ ${#devices[*]} -eq 0 ]; then echo "Nothing can be done, bye." exit 0 fi if [ ${#devices[*]} -eq 1 ]; then dev=${devices[0]} label="$(get_label ${devices[0]})" else choose_device dev=${devices[$REPLY]} label="$(get_label $dev)" fi echo "mounting /dev/$dev in /media/$label" exec pmount $dev "$label" fi exec /usr/bin/pmount "$@"