Como posso obter o caminho de montagem de um dispositivo USB no OSX?


58

Eu tenho um script de backup que faz backup de alguns dados em um dispositivo USB. O problema que tenho é que o OSX às vezes altera o caminho de montagem esperado. Por exemplo, se algum arquivo estiver bloqueado no caminho de montagem esperado, o OSX o monta em outro caminho. Um dispositivo USB chamado 'BACKUP' pode ser montado em / Volumes / BACKUP-1 em vez de / Volumes / BACKUP.

Existe uma maneira de descobrir o caminho de montagem atual de um dispositivo USB no terminal OSX? Algo como 'mount_path BACKUP' (comando é falso) que retornaria '/ Volumes / BACKUP-1' ou nada se o dispositivo não estivesse montado?

Respostas:


68

Os seguintes comandos mostram informações sobre volumes montados:

  • O conhecido Unix mount, mostrando, por exemplo, /dev/disk5s3montado em/Volumes/Foo
  • diskutil list mostra uma visão geral de todos os discos e volumes
  • diskutil info /dev/disk5s3mostra informações sobre esse volume, incluindo um Volume UUIDque pode ser usado para identificar exclusivamente esse volume.

Você pode consultar diskutil infousando o UUID do volume:

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

Exemplo de saída de comando no meu 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

Eu esperava evitar ter que usar esses comandos e analisar meu caminho através disso :) Mas se não houver outra maneira, você conhece alguma função bash que faça isso por você?
Xastor 26/05/12

@xastor Adicionou informação relevante. man diskutilteria ajudado.
Daniel Beck

Obrigado, eu escrevi um script agora e funciona. Eu esperava que houvesse outra maneira, eu deveria ter mencionado isso na pergunta. Por exemplo, o que acontece em um sistema OSX com outro idioma? Eu não posso grep 'Monte Volume' em um sistema francês suponho ..
xastor

@xastor diskutilnão está localizado.
Daniel Beck

11
Esta é uma solução confiável então. Obrigado!
Xastor

10

E esse comando:

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

Na coluna "Montado", você obtém todos os pontos de montagem de todos os dispositivos montados "/Volumes", que no meu caso são quase sempre dispositivos USB ;-)

Os grepcomandos basicamente ignoram o disco rígido no qual está montado "/".

No terminal do meu OSX Snow Leopard, eu o uso para uma rápida visão geral dos pontos de montagem dos meus dispositivos USB conectados no momento. Se você está interessado apenas em pontos de montagem e não em todos os outros parâmetros como UUID etc., isso seria, na minha opinião, o caminho mais direto e não "diskutil"com todas as suas informações.


2

Eu o recupero em uma variável:

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

ou

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

O dfcomando lista as partições, a saída resultante é canalizada como entrada para o comando grep, que filtra e mantém apenas as linhas que contêm a palavra mídia, que é canalizada para o awkcomando que mantém apenas a 6a coluna da entrada de uma linha.


A segunda forma deve ser muito preferida, mas não é óbvio como passar o /media/regex parametrizado. Tente media=$(df | awk -v regex="$regex" '$1 ~ regex { print $6 }')passar a variável shell $regexcomo a coisa a procurar.
Tripleee

1

Apenas o bom e velho diskutil. Este não é o Linux, onde você provavelmente pode espiar em / sys ou algo assim.

diskutil info "$VolumeName" | grep "Mount Point" | tr " " "\n" | tail -1

0

Eu apenas usaria o fstab para isso. Há um tópico sobre esse tópico aqui no Superusuário: Mac Lion: o fstab está obsoleto. Então, o que a substitui para impedir a montagem de uma partição?


11
E como você usaria fstabpara isso, exatamente?
Daniel Beck

Tomando a UUId da unidade USB, criando um ponto de montagem e fornecendo tudo para / etc / fstab. Sempre que a unidade USB mencionada acima estiver conectada, ela será montada nesse ponto de montagem, reconhecido pelo seu UUID.
Dag729

Observe que o problema do usuário vem do ponto de montagem padrão já em uso devido.
Daniel Beck

Isso foi o que eu quis dizer: atribuir ao sistema operacional um ponto de montagem usando / etc / fstab. A partir desse momento, o sistema lerá / etc / fstab, descobrirá que há um UUID com um ponto de montagem associado e o usará em vez do padrão.
Dag729

0

Acabei 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';

Isso foi em setembro passado, e ninguém comentou ainda? seu 'Mount Point' DEVE ser 'Device Node' se você espera que esse script faça o que os comentários dizem.

11
@Blakat O nó do dispositivo não é o que o OP estava pedindo. O ponto de montagem é /Volumes/…, que é o que todo mundo estava falando se eu ler esta pergunta corretamente.
slhck

Se você estiver usando de sedqualquer maneira, oe grepo cutsão inúteis ; diskutil info "$1" | sed -n '/^ *Mount Point: */!d;s///;s/ *$//p'
Tripleee 3/17

0

É isso que eu uso nos meus scripts de shell no OS X

df | awk '{print $6}' | grep -Ex "/Volumes/myvolume"

Você pode adicionar algumas frases para explicar como isso funciona? Obrigado.
fixer1234

Esta é uma maneira indireta de dizer, df | awk '$6 == "/Volumes/myvolume" { print $6 }'ou seja, imprima o caminho do volume, se for exatamente o esperado. A grep -Ebandeira é supérflua aqui e grepé inútil porque o Awk já sabe muito bem como combinar uma expressão regular.
Tripleee

Um comando mais útil provavelmente faria grep para o volume antes de imprimir apenas o sexto campo, ou ainda melhor, altere o primeiro $6para $1no meu comentário anterior.
Tripleee

-1

Isso pode funcionar melhor:

df -lH | grep -E "*putinyourvolumelabel*$" | awk '{print $1}''

6
Por que isso funciona melhor?
bertieb

Dennis, bem-vindo ao superusuário. Algumas das outras respostas não são bons exemplos, mas o objetivo das respostas é educar, em vez de apenas fornecer código de recortar e colar. Eu não sou um codificador, então não sei como a solução pode ser boa, mas suspeito que o comentário de bertieb, e talvez o voto negativo, vá para o fato de que esse é apenas um código inexplicável, e não para a qualidade da solução. Você pode adicionar algumas frases para explicar o que isso faz e o que a torna uma solução melhor do que a que você a comparou? Obrigado.
fixer1234
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.