Jak mogę uzyskać ścieżkę montowania urządzenia USB w OSX?

58

Mam skrypt kopii zapasowej, który tworzy kopię zapasową niektórych danych na urządzeniu USB. Problemem jest to, że OSX czasami zmienia oczekiwaną ścieżkę montowania. Na przykład jeśli jakiś plik jest zablokowany pod oczekiwaną ścieżką montowania, OSX montuje go na innej ścieżce. Urządzenie USB o nazwie „BACKUP” można zamontować w / Volumes / BACKUP-1 zamiast / Volumes / BACKUP.

Czy istnieje sposób na znalezienie bieżącej ścieżki montażu urządzenia USB w terminalu OSX? Coś w stylu „mount_path BACKUP” (polecenie jest fałszywe), które zwróciłoby „/ Volumes / BACKUP-1” lub nic, gdyby urządzenie nie zostało zamontowane?

Xastor
źródło

Odpowiedzi:

68

Następujące polecenia pokazują informacje o zamontowanych woluminach:

  • Dobrze znany Uniks mount, pokazujący np. /dev/disk5s3Zamontowany na/Volumes/Foo
  • diskutil list pokazuje przegląd wszystkich dysków i woluminów
  • diskutil info /dev/disk5s3pokazuje informacje o tym woluminie, w tym dane Volume UUID, których można użyć do jednoznacznej identyfikacji tego woluminu.

Możesz wykonać zapytanie diskutil infoza pomocą UUID woluminu:

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

Przykładowe dane wyjściowe polecenia w moim systemie:

$ 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
źródło
Miałem nadzieję uniknąć konieczności używania tych poleceń i analizowania mojej drogi :) Ale jeśli nie ma innego sposobu, czy znasz jakieś funkcje bash, które to robią?
xastor
@xastor Dodano odpowiednie informacje. man diskutilpomógłby.
Daniel Beck
Dzięki, napisałem teraz skrypt i działa. Miałem nadzieję, że istnieje inny sposób, powinienem był o tym wspomnieć w pytaniu. Na przykład, co dzieje się w systemie OSX z innym językiem? Nie mogę grepować „Mount Volume” na francuskim systemie.
Xastor
@xastor diskutilnie jest zlokalizowany.
Daniel Beck
1
Jest to zatem niezawodne rozwiązanie. Dziękuję Ci!
xastor
10

Co z tym poleceniem:

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

W kolumnie „Zamontowane” znajdują się wszystkie punkty montażu wszystkich zamontowanych urządzeń "/Volumes", które w moim przypadku prawie zawsze są urządzeniami USB ;-)

Do grepkomendy w zasadzie pominąć dysk twardy, który jest zamontowany na "/".

W terminalu mojego OSX Snow Leopard używam go do szybkiego przeglądu punktów montowania aktualnie podłączonych urządzeń USB. Jeśli interesują Cię tylko Punkty Montażu, a nie wszystkie inne parametry, takie jak UUID itp., Moim zdaniem byłby to bardziej prosty sposób niż "diskutil"z wszystkimi jego informacjami.

Mallin
źródło
2

Pobieram go w zmiennej:

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

lub

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

W dflistuje przegródki, uzyskany wyjście jest jako wejście do polecenia grep, który filtruje i przechowuje tylko wiersze zawierające nośnik słowo, które następnie odprowadzone do awkkomendy, który utrzymuje tylko 6th kolumnę wejściu jednej linii.

Stephane
źródło
Druga postać powinna być znacznie preferowana, ale nie jest oczywiste, jak przekazać /media/sparametryzowane wyrażenie regularne. Spróbuj media=$(df | awk -v regex="$regex" '$1 ~ regex { print $6 }')przekazać zmienną powłoki $regexjako rzecz do wyszukania.
tripleee
1

Po prostu stary dobry diskutil. To nie jest Linux, gdzie prawdopodobnie możesz zajrzeć do / sys lub coś takiego.

diskutil info "$VolumeName" | grep "Mount Point" | tr " " "\n" | tail -1
Haotian Yang
źródło
0

Po prostu użyłbym do tego fstab. W Super User jest wątek na ten temat: Mac Lion: fstab jest przestarzałe. więc co go zastępuje, aby zapobiec montowaniu partycji?

dag729
źródło
1
A jak byś fstabto dokładnie wykorzystał?
Daniel Beck
Biorąc UUId napędu USB, tworząc punkt montowania i przekazując wszystko do / etc / fstab. Ilekroć wspomniany dysk USB zostanie podłączony, będzie montowany w tym punkcie montowania, rozpoznawanym przez jego UUID.
dag729
Zauważ, że problem użytkownika wynika z domyślnego punktu montowania, który jest już w użyciu z powodu.
Daniel Beck
Właśnie to miałem na myśli: nadanie systemowi punktu montowania za pomocą / etc / fstab. Od tego momentu system odczyta / etc / fstab, stwierdzi, że istnieje UUID ze skojarzonym punktem montowania i użyje go zamiast domyślnego.
dag729
0

Skończyło się na tym skrypcie 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
źródło
To był wrzesień ubiegłego roku i nikt jeszcze tego nie skomentował? zamiast tego „Mount Point” POWINIEN być „Węzłem urządzenia”, jeśli spodziewasz się, że ten skrypt zrobi to, co mówią komentarze.
1
@Blakat Węzeł urządzenia nie jest tym, o co prosi OP. Punktem montowania jest to /Volumes/…, o czym wszyscy mówili, jeśli poprawnie przeczytałem to pytanie.
slhck
Jeśli sedmimo to używasz , grepi cutbezużyteczne ; diskutil info "$1" | sed -n '/^ *Mount Point: */!d;s///;s/ *$//p'
tripleee
0

Tego używam w skryptach powłoki w systemie OS X.

df | awk '{print $6}' | grep -Ex "/Volumes/myvolume"
DannyRe
źródło
Czy możesz dodać kilka zdań, aby wyjaśnić, jak to działa? Dzięki.
fixer1234
Jest to okrągły sposób powiedzenia, df | awk '$6 == "/Volumes/myvolume" { print $6 }'np. Wydrukuj ścieżkę woluminu, jeśli jest to dokładnie oczekiwana. grep -EFlaga jest zbędny, a tu grepjest bezużyteczny , ponieważ awk zna już dość dobrze jak dopasować wyrażenie regularne.
tripleee
Bardziej przydatne polecenie prawdopodobnie grep dla woluminu przed wydrukowaniem tylko szóstego pola, a nawet lepiej zmienić pierwszy $6na $1w moim poprzednim komentarzu.
tripleee
-1

To może działać lepiej:

df -lH | grep -E "*putinyourvolumelabel*$" | awk '{print $1}''
Dennis Eisen
źródło
6
Dlaczego to może działać lepiej?
bertieb
Dennis, witamy w Super User. Kilka innych odpowiedzi nie jest dobrym przykładem, ale celem odpowiedzi jest wykształcenie, a nie tylko dostarczenie kodu wycinania i wklejania. Nie jestem programistą, więc nie mogę się wypowiedzieć na temat tego, jak dobre może być twoje rozwiązanie, ale podejrzewam, że komentarz bertieba i być może opinia negatywna wskazują na fakt, że jest to po prostu niewyjaśniony kod, a nie na jakość rozwiązania. Czy możesz dodać kilka zdań, aby wyjaśnić, co to robi i co sprawia, że ​​jest to lepsze rozwiązanie niż to, z czym się porównałeś? Dzięki.
fixer1234