В скрипте, над которым я работаю, переменная UUID должна использоваться для получения текущей точки монтирования, к которой подключено устройство. Решение, которое я придумал, следующее:
UUID='fc70ae3d-65e7-4437-a371-b237c8ca3f56h'
MNTPNT=$(lsblk -o +UUID | grep ${UUID} | tr -s ' ' | cut -d ' ' -f 7)
После выполнения команды переменная MNTPNT сохраняет текущую точку монтирования, как и ожидалось.. Однако это довольно обширная команда, и я не могу не думать о том, что должен быть более эффективный способ достижения той же цели.
Можно ли придумать лучшее решение? Это будет в основном вопрос оптимизации. Заранее спасибо за любые идеи.
решение1
findmnt -noTARGET "/dev/disk/by-uuid/$UUID"
grep "$(stat -Lc '%#t %#T' "/dev/disk/by-uuid/$UUID" | xargs printf '%d:%d')" /proc/self/mountinfo
awk -v dev="$(stat -Lc '%#t %#T' "/dev/disk/by-uuid/$UUID" | xargs printf '%d:%d')" '$3~dev{print$5}' /proc/self/mountinfo
Для обрезки креплений:
awk -v dev="$(stat -Lc '%#t %#T' "/dev/disk/by-uuid/$UUID" | xargs printf '%d:%d')" '$3~dev&&$4=="/"{print$5}' /proc/self/mountinfo
Имейте в виду, что устройства можно устанавливать в нескольких местах.
Чудовищность $(stat ... | xargs printf)
только в том, что stat(1)
не может напечатать главные и второстепенные числадесятичная дробь. Простой анализ вывода, ls -Hl
вероятно, был бы лучше (и гораздо более переносимым).
решение2
df | grep "^$(readlink -f /dev/disk/by-uuid/$UUID) " |sed 's/^[^%]*% \+//'
Это работает также при наличии bind-mounts подкаталогов монтирования, что может запутать некоторые другие потенциальные решения.
(Изменить:)
Разрешить пробелы в точке монтирования.
(Ред.2:)
Точка монтирования также может содержать «%».