¿Cómo puedo obtener la ruta de montaje de un dispositivo USB en OSX?

58

Tengo un script de copia de seguridad que hace una copia de seguridad de algunos datos en un dispositivo USB. El problema que tengo es que OSX a veces cambia la ruta de montaje esperada. Por ejemplo, si algún archivo está bloqueado en la ruta de montaje esperada, OSX lo monta en otra ruta. Se puede montar un dispositivo USB llamado 'BACKUP' en / Volumes / BACKUP-1 en lugar de / Volumes / BACKUP.

¿Hay alguna manera de averiguar la ruta de montaje actual de un dispositivo USB en el terminal OSX? ¿Algo como 'mount_path BACKUP' (comando es falso) que luego devolvería '/ Volumes / BACKUP-1' o nada si el dispositivo no estuviera montado?

xastor
fuente

Respuestas:

68

Los siguientes comandos muestran información sobre volúmenes montados:

  • El conocido Unix mount, que muestra, por ejemplo, /dev/disk5s3montado en/Volumes/Foo
  • diskutil list muestra una descripción general de todos los discos y volúmenes
  • diskutil info /dev/disk5s3muestra información sobre ese volumen, incluido uno Volume UUIDque se puede usar para identificar de forma exclusiva ese volumen.

Puede consultar diskutil infoutilizando el UUID del volumen:

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

Salida de comando de muestra en mi sistema:

$ 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
Daniel Beck
fuente
Esperaba evitar tener que usar esos comandos y analizar mi camino a través de esto :) Pero si no hay otra forma, ¿conoces alguna función bash que haga esto por ti?
xastor
@xastor Se agregó información relevante. man diskutilHabría ayudado.
Daniel Beck
Gracias, escribí un guión ahora y funciona. Sin embargo, esperaba que hubiera otra forma, debería haberlo mencionado en la pregunta. Por ejemplo, ¿qué sucede en un sistema OSX con otro idioma? No puedo grep 'de montaje de volumen' en un sistema francés supongo ..
xastor
@xastor diskutilno está localizado.
Daniel Beck
1
Esta es una solución confiable entonces. ¡Gracias!
xastor
10

¿Qué pasa con este comando:

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

En la columna "Montado en" obtendrá todos los puntos de montaje de todos los dispositivos montados "/Volumes", que en mi caso son casi siempre dispositivos USB ;-)

Los grepcomandos básicamente omiten el disco duro que está montado "/".

En el terminal de mi OSX Snow Leopard, lo uso para una visión general rápida de los puntos de montaje de mis dispositivos USB conectados actualmente. Si solo está interesado en Mount Points y no en todos los demás parámetros como UUID, etc., esto sería, en mi opinión, la forma más directa en lugar de "diskutil"con toda su información.

mallin
fuente
2

Lo recupero en una variable:

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

o

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

El dfcomando enumera las particiones, la salida resultante se canaliza como entrada al comando grep que filtra y mantiene solo las líneas que contienen la palabra media, que luego se canaliza al awkcomando que solo mantiene la sexta columna de su entrada de una línea.

Stephane
fuente
La segunda forma debería ser muy preferida, pero no es obvio cómo pasar la /media/expresión regular parametrizada. Intente media=$(df | awk -v regex="$regex" '$1 ~ regex { print $6 }')pasar la variable de shell $regexcomo la cosa a buscar.
tripleee
1

Solo los buenos viejos diskutil. Esto no es Linux, donde probablemente puedas echar un vistazo a / sys o algo así.

diskutil info "$VolumeName" | grep "Mount Point" | tr " " "\n" | tail -1
Yang de Haotian
fuente
0

Simplemente usaría fstab para esto. Hay un hilo sobre este tema aquí en Super Usuario: Mac Lion: fstab está en desuso. Entonces, ¿qué lo reemplaza para evitar que se monte una partición?

dag729
fuente
1
¿ Y cómo usarías fstabesto exactamente?
Daniel Beck
Tomando el UUId de la unidad USB, creando un punto de montaje y dándolo todo a / etc / fstab. Siempre que se conecte la unidad USB mencionada anteriormente, se montará en ese punto de montaje, reconocido por su UUID.
dag729
Tenga en cuenta que el problema del usuario proviene del punto de montaje predeterminado que ya está en uso debido.
Daniel Beck
Eso es lo que quise decir: darle al sistema operativo un punto de montaje usando / etc / fstab. A partir de ese momento, el sistema leerá / etc / fstab, encontrará que hay un UUID con un punto de montaje asociado y lo usará en lugar del predeterminado.
dag729
0

Terminé usando este script 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
fuente
Esto fue en septiembre pasado, ¿y nadie lo ha comentado todavía? su 'Punto de montaje' DEBE ser en su lugar 'Nodo de dispositivo' si espera que este script haga lo que dicen los comentarios.
1
@Blakat El nodo del dispositivo no es lo que pedía el OP. El punto de montaje es /Volumes/…, que es de lo que todos estaban hablando si leía esta pregunta correctamente.
slhck
Si está utilizando de sedtodos modos, el grepy el cutson inútiles ; diskutil info "$1" | sed -n '/^ *Mount Point: */!d;s///;s/ *$//p'
tripleee
0

Esto es lo que uso en mis scripts de shell en OS X

df | awk '{print $6}' | grep -Ex "/Volumes/myvolume"
DannyRe
fuente
¿Puedes agregar algunas oraciones para explicar cómo funciona esto? Gracias.
fijador1234
Esta es una forma indirecta de decir, df | awk '$6 == "/Volumes/myvolume" { print $6 }'es decir, imprimir la ruta del volumen si es exactamente la esperada. La grep -Ebandera es superflua aquí y grepes inútil porque Awk ya sabe bastante bien cómo combinar una expresión regular.
tripleee
Un comando más útil sería probablemente grep para el volumen antes de imprimir sólo el sexto campo, o incluso mejor cambiar el primer $6a $1en mi comentario anterior.
tripleee
-1

Esto podría funcionar mejor:

df -lH | grep -E "*putinyourvolumelabel*$" | awk '{print $1}''
Dennis Eisen
fuente
66
¿Por qué podría funcionar mejor?
bertieb
Dennis, bienvenido a Super User. Algunas de las otras respuestas no son buenos ejemplos, pero el objetivo de las respuestas es educar en lugar de solo proporcionar código de cortar y pegar. No soy un programador, así que no puedo abordar qué tan buena podría ser su solución, pero sospecho que el comentario de bertieb, y tal vez el voto negativo, va al hecho de que esto es solo un código inexplicado, en lugar de la calidad de la solución. ¿Puedes agregar algunas oraciones para explicar qué hace esto y qué lo hace una mejor solución que con lo que sea que lo estuvieras comparando? Gracias.
fijador1234