Как я могу получить путь монтирования USB-устройства на OSX?

58

У меня есть скрипт резервного копирования, который выполняет резервное копирование некоторых данных на USB-устройство. У меня проблема в том, что OSX иногда меняет ожидаемый путь монтирования. Например, если какой-либо файл заблокирован по ожидаемому пути монтирования, OSX монтирует его по другому пути. Устройство USB с именем 'BACKUP' может быть установлено в / Volumes / BACKUP-1 вместо / Volumes / BACKUP.

Есть ли способ узнать текущий путь монтирования USB-устройства в терминале OSX? Что-то вроде 'mount_path BACKUP' (команда fake), которое затем вернет '/ Volumes / BACKUP-1', или ничего, если устройство не было смонтировано?

xastor
источник

Ответы:

68

Следующие команды показывают информацию о подключенных томах:

  • Хорошо известный Unix mount, показывающий, например, /dev/disk5s3установленный на/Volumes/Foo
  • diskutil list показывает обзор всех дисков и томов
  • diskutil info /dev/disk5s3показывает информацию об этом томе, включая тот, Volume UUIDкоторый может быть использован для уникальной идентификации этого тома.

Вы можете сделать запрос diskutil info, используя UUID тома:

$ diskutil info DEC8759E-F77D-3EAE-B3EB-B6438F1AA428 | grep 'Mount Point'
   Mount Point:              /Volumes/DroboOne

Пример вывода команды в моей системе:

$ mount
/dev/disk1 on / (hfs, local, journaled)
devfs on /dev (devfs, local, nobrowse)
map -hosts on /net (autofs, nosuid, automounted, nobrowse)
map auto_home on /home (autofs, automounted, nobrowse)
localhost:/bNqIvVr1ZdFBdf19Io81Q4 on /Volumes/MobileBackups (mtmfs, nosuid, read-only, nobrowse)
/dev/disk4 on /Volumes/MyBook (hfs, local, nodev, nosuid, journaled)
/dev/disk5s3 on /Volumes/DroboOne (hfs, local, nodev, nosuid, journaled, noowners)
/dev/disk7s3 on /Volumes/DroboTwo (hfs, local, nodev, nosuid, journaled, noowners)
/dev/disk6s3 on /Volumes/DroboThree (hfs, local, nodev, nosuid, journaled, noowners)

$ diskutil list
/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *256.1 GB   disk0
   1:                        EFI                         209.7 MB   disk0s1
   2:          Apple_CoreStorage                         240.0 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                  Apple_HFS Servus10 HD            *239.7 GB   disk1
/dev/disk2
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *3.0 TB     disk2
   1:                        EFI                         209.7 MB   disk2s1
   2:          Apple_CoreStorage                         3.0 TB     disk2s2
   3:                 Apple_Boot Boot OS X               134.2 MB   disk2s3
/dev/disk4
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                  Apple_HFS MyBook                 *3.0 TB     disk4
/dev/disk5
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     Apple_partition_scheme                        *2.2 TB     disk5
   1:        Apple_partition_map                         32.3 KB    disk5s1
   2:                  Apple_HFS DroboOne                2.2 TB     disk5s3
/dev/disk6
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     Apple_partition_scheme                        *2.2 TB     disk6
   1:        Apple_partition_map                         32.3 KB    disk6s1
   2:                  Apple_HFS DroboThree              2.2 TB     disk6s3
/dev/disk7
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     Apple_partition_scheme                        *2.2 TB     disk7
   1:        Apple_partition_map                         32.3 KB    disk7s1
   2:                  Apple_HFS DroboTwo                2.2 TB     disk7s3

$ diskutil info /dev/disk5s3
   Device Identifier:        disk5s3
   Device Node:              /dev/disk5s3
   Part of Whole:            disk5
   Device / Media Name:      Untitled

   Volume Name:              DroboOne
   Escaped with Unicode:     DroboOne

   Mounted:                  Yes
   Mount Point:              /Volumes/DroboOne
   Escaped with Unicode:     /Volumes/DroboOne

   File System Personality:  Journaled HFS+
   Type (Bundle):            hfs
   Name (User Visible):      Mac OS Extended (Journaled)
   Journal:                  Journal size 172032 KB at offset 0x4001000
   Owners:                   Disabled

   Partition Type:           Apple_HFS
   OS Can Be Installed:      No
   Media Type:               Generic
   Protocol:                 FireWire
   SMART Status:             Not Supported
   Volume UUID:              DEC8759E-F77D-3EAE-B3EB-B6438F1AA428

   Total Size:               2.2 TB (2198888927232 Bytes) (exactly 4294704936 512-Byte-Blocks)
   Volume Free Space:        169.4 GB (169412173824 Bytes) (exactly 330883152 512-Byte-Blocks)
   Device Block Size:        512 Bytes

   Read-Only Media:          No
   Read-Only Volume:         No
   Ejectable:                Yes

   Whole:                    No
   Internal:                 No
Даниэль Бек
источник
Я надеялся избежать необходимости использовать эти команды и анализировать мой путь через это :) Но если нет другого пути, знаете ли вы какие-нибудь функции bash, которые делают это для вас?
xastor
@xastor Добавлена ​​актуальная информация. man diskutilпомог бы
Даниэль Бек
Спасибо, я написал сценарий сейчас, и он работает. Я надеялся, что есть и другой путь, я должен был упомянуть об этом в этом вопросе. Например, что происходит в системе OSX с другим языком? Я не могу использовать 'Mount Volume' для французской системы, я полагаю ..
xastor
@xastor diskutilне локализован.
Даниэль Бек
1
Это надежное решение. Спасибо!
xastor
10

Как насчет этой команды:

df -lH | grep "Filesystem"; df -lH | grep "/Volumes/*"

В столбце «Установлено» вы получаете все точки монтирования всех подключенных устройств "/Volumes", которые в моем случае почти всегда являются устройствами USB ;-)

Эти grepкоманды в основном пропустить жесткий диск , который установлен на "/".

В терминале моего OSX Snow Leopard я использую его для быстрого обзора точек монтирования моих подключенных USB-устройств. Если вы заинтересованы только в точках монтирования, а не во всех других параметрах, таких как UUID и т. Д., То, на мой взгляд, это будет более прямой путь, чем "diskutil"со всей его информацией.

Mallin
источник
2

Я получаю это в переменной:

media=\`df | grep "media" | awk '{print $6}'\`

или же

media=$(df | awk '/media/ {print $6}')

Команда dfперечисляет разделы, результирующий вывод передается по конвейеру в качестве входных данных для команды grep, которая фильтрует и сохраняет только строки, содержащие слово media, которая затем передается в awkкоманду, которая содержит только шестой столбец своего однострочного ввода.

Stephane
источник
Вторая форма должна быть намного предпочтительнее, но не очевидно, как передать /media/параметризованное регулярное выражение. Попытайтесь media=$(df | awk -v regex="$regex" '$1 ~ regex { print $6 }')передать переменную оболочки $regexкак то, что нужно искать.
tripleee
1

Просто старый добрый diskutil. Это не Linux, где вы можете заглянуть в / sys или что-то в этом роде.

diskutil info "$VolumeName" | grep "Mount Point" | tr " " "\n" | tail -1
Хаотянь Ян
источник
0

Я бы просто использовал fstab для этого. На эту тему есть тема на Super User: Mac Lion: fstab устарела. так, что заменяет это, чтобы препятствовать тому, чтобы раздел был установлен?

dag729
источник
1
И как бы вы использовали fstabдля этого, точно?
Даниэль Бек
Взятие UUId USB-накопителя, создание точки монтирования и передача всего этого в / etc / fstab. Всякий раз, когда вышеупомянутый USB-накопитель подключен, он будет смонтирован в этой точке монтирования, распознаваемой по его UUID.
dag729
Обратите внимание, что проблема пользователя связана с уже используемой точкой монтирования по умолчанию.
Даниэль Бек
Это то, что я имел в виду: предоставление ОС точки монтирования с помощью / etc / fstab. С этого момента система прочитает / etc / fstab, обнаружит, что есть UUID со связанной точкой монтирования, и будет использовать его вместо значения по умолчанию.
dag729
0

Я закончил тем, что использовал этот скрипт bash:

#!/bin/sh
#
# Retrieves the mount point of an OSX volume name or UUID.
# @param $1 Name of the volume or UUID of the volume.
# @return returns the mount path or an empty string if the volume is not mounted. 
#
diskutil info $1 | grep 'Mount Point' | cut -d : -f 2 | sed 's/^ *//g' | sed 's/ *$//g';
xastor
источник
Это было в сентябре прошлого года, и никто еще не прокомментировал это? вместо этого ваша «точка монтирования» ДОЛЖНА быть «Узлом устройства», если вы ожидаете, что этот скрипт будет делать то, что говорится в комментариях.
1
@Blakat Узел устройства - это не то, что запрашивал OP. Точка монтирования - /Volumes/…это то, о чем все говорили, если я правильно прочитал этот вопрос.
Slhck
Если вы используете в sedлюбом случае, grepи cutэто бесполезно ; diskutil info "$1" | sed -n '/^ *Mount Point: */!d;s///;s/ *$//p'
tripleee
0

Это то, что я использую в своих сценариях оболочки на OS X

df | awk '{print $6}' | grep -Ex "/Volumes/myvolume"
DannyRe
источник
Можете ли вы добавить несколько предложений, чтобы объяснить, как это работает? Благодарю.
fixer1234
Это окольный способ сказать, df | awk '$6 == "/Volumes/myvolume" { print $6 }'то есть вывести путь объема, если он точно соответствует ожидаемому. grep -EФлаг лишний здесь и grepбесполезно , потому что Awk уже хорошо знает , как соответствовать регулярному выражению.
tripleee
Более полезная команда, вероятно, будет использовать grep для объема перед печатью только шестого поля, или даже лучше поменять первое $6на $1в моем предыдущем комментарии.
tripleee
-1

Это может работать лучше:

df -lH | grep -E "*putinyourvolumelabel*$" | awk '{print $1}''
Деннис Эйзен
источник
6
Почему это может работать лучше?
bertieb
Деннис, добро пожаловать в Super User. Несколько других ответов не являются хорошими примерами, но цель ответов состоит в том, чтобы научить, а не просто предоставить вырезанный код. Я не программист, поэтому я не могу сказать, насколько хорошим может быть ваше решение, но я подозреваю, что комментарий Бертиба и, возможно, отрицательное мнение, сводятся к тому, что это просто необъяснимый код, а не качество решения. Можете ли вы добавить несколько предложений, чтобы объяснить, что это делает, и что делает его лучшим решением, чем то, с чем вы его сравнивали? Благодарю.
fixer1234