Comment puis-je obtenir le chemin de montage d'un périphérique USB sous OSX?

58

J'ai un script de sauvegarde qui sauvegarde des données sur un périphérique USB. Le problème que j'ai, c'est qu'OSX modifie parfois le chemin de montage attendu. Par exemple, si un fichier est verrouillé sous le chemin de montage attendu, OSX le monte sur un autre chemin. Un périphérique USB nommé 'BACKUP' peut être monté sur / Volumes / BACKUP-1 au lieu de / Volumes / BACKUP.

Existe-t-il un moyen de connaître le chemin de montage actuel d'un périphérique USB dans le terminal OSX? Quelque chose comme 'mount_path BACKUP' (la commande est fausse) qui renverrait alors '/ Volumes / BACKUP-1' ou rien si le périphérique n'était pas monté?

xastor
la source

Réponses:

68

Les commandes suivantes vous montrent des informations sur les volumes montés:

  • Le célèbre Unix mount, montrant par exemple /dev/disk5s3monté à/Volumes/Foo
  • diskutil list montre un aperçu de tous les disques et volumes
  • diskutil info /dev/disk5s3affiche des informations sur ce volume, y compris un Volume UUIDfichier pouvant être utilisé pour identifier ce volume de manière unique.

Vous pouvez interroger diskutil infoen utilisant l'UUID du volume:

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

Exemple de sortie de commande sur mon système:

$ 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
la source
J'espérais éviter d'avoir à utiliser ces commandes et à analyser mon chemin à travers :) :) S'il n'y a pas d'autre moyen, connaissez-vous des fonctions bash qui le font pour vous?
Xastor
@xastor Ajout d'informations pertinentes. man diskutilaurait aidé.
Daniel Beck
Merci, j'ai écrit un script maintenant et ça marche. J'espérais qu'il y avait un autre moyen, j'aurais dû le mentionner dans la question. Par exemple, que se passe-t-il sur un système OSX avec une autre langue? Je ne peux pas grep 'Mount Volume' sur un système français je suppose ..
xastor
@xastor diskutiln'est pas localisé.
Daniel Beck
1
C'est une solution fiable alors. Je vous remercie!
Xastor
10

Qu'en est-il de cette commande:

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

Dans la colonne "Monté sur", vous trouverez tous les points de montage de tous les périphériques montés "/Volumes", qui dans mon cas sont presque toujours des périphériques USB ;-)

Les grepcommandes ignorent essentiellement le disque dur sur lequel est monté "/".

Dans le terminal de mon OSX Snow Leopard, je l'utilise pour un aperçu rapide des points de montage de mes périphériques USB actuellement connectés. Si vous êtes uniquement intéressé par les points de montage et non par tous les autres paramètres tels que UUID, etc., ce serait, à mon avis, le moyen le plus simple de procéder plutôt "diskutil"qu'avec toutes ses informations.

Mallin
la source
2

Je le récupère dans une variable:

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

ou

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

La dfcommande répertorie les partitions, la sortie résultante est acheminée vers la commande grep qui filtre et ne conserve que les lignes contenant le mot media, qui est ensuite acheminée vers la awkcommande qui ne conserve que la 6e colonne de son entrée.

Stéphane
la source
La seconde forme devrait être bien préférée, mais il n’est pas évident de savoir comment passer dans la /media/regex paramétrée. Essayez media=$(df | awk -v regex="$regex" '$1 ~ regex { print $6 }')de transmettre la variable shell en $regextant que chose à rechercher.
triplee
1

Juste le bon vieux diskutil. Ce n'est pas Linux, où vous pouvez probablement jeter un coup d'œil dans / sys ou quelque chose du genre.

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

Je voudrais juste utiliser fstab pour cela. Vous trouverez un fil conducteur à ce sujet sur Super User: Mac Lion: fstab est obsolète. alors qu'est-ce qui le remplace pour empêcher une partition de monter?

dag729
la source
1
Et comment utiliseriez-vous fstabpour cela, exactement?
Daniel Beck
Prendre l’UUId de la clé USB, créer un point de montage et tout donner à / etc / fstab. Chaque fois que le lecteur USB susmentionné est connecté, il sera monté sur ce point de montage, reconnu par son UUID.
dag729
Notez que le problème de l'utilisateur provient du fait que le point de montage par défaut est déjà utilisé.
Daniel Beck
C’est ce que je voulais dire: donner un point de montage au système d’exploitation en utilisant / etc / fstab. À partir de ce moment, le système lira / etc / fstab, trouvera qu’il existe un UUID avec un point de montage associé et l’utilisera à la place de celui par défaut.
dag729
0

J'ai fini par utiliser ce 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
la source
C'était en septembre dernier, et personne ne l'a encore commenté? votre "point de montage" DEVRAIT être plutôt "Nœud de périphérique" si vous vous attendez à ce que ce script fasse ce que les commentaires disent.
1
@Blakat Le nœud de périphérique n'est pas ce que l'OP demandait. Le point de montage est /Volumes/…, et c’est ce dont tout le monde parlait si je lisais correctement cette question.
Slhck
Si vous utilisez sedquand même, le grepet le cutsont inutiles ; diskutil info "$1" | sed -n '/^ *Mount Point: */!d;s///;s/ *$//p'
triplee
0

C’est ce que j’utilise dans mes scripts shell sous OS X

df | awk '{print $6}' | grep -Ex "/Volumes/myvolume"
DannyRe
la source
Pouvez-vous ajouter quelques phrases pour expliquer comment cela fonctionne? Merci.
fix1234
C’est une façon détournée de dire, df | awk '$6 == "/Volumes/myvolume" { print $6 }'c’est-à-dire d’imprimer le chemin du volume si c’est exactement celui attendu. Le grep -Edrapeau est superflu ici et grepinutile car Awk sait déjà très bien comment faire correspondre une expression régulière.
triplee
Une commande utile plus probablement grep pour le volume avant l' impression que le sixième champ, ou mieux encore changer le premier $6à $1mon commentaire précédent.
tripleee
-1

Cela pourrait mieux fonctionner:

df -lH | grep -E "*putinyourvolumelabel*$" | awk '{print $1}''
Dennis Eisen
la source
6
Pourquoi cela pourrait-il mieux fonctionner?
bertieb
Dennis, bienvenue sur Super User. Quelques autres réponses ne sont pas de bons exemples, mais leur objectif est d’éduquer plutôt que de simplement fournir du code copier-coller. Je ne suis pas un codeur, je ne peux donc pas vous dire à quel point votre solution pourrait être bonne, mais je suppose que le commentaire de Bertieb, et peut-être le vote négatif, explique-t-il qu'il s'agit simplement d'un code inexpliqué, plutôt que de la qualité de la solution. Pouvez-vous ajouter quelques phrases pour expliquer ce que cela fait et ce qui en fait une meilleure solution que celle que vous avez comparée? Merci.
fixer1234