xanadu6291
xanadu6291

Reputation: 931

Command line to unmount all external drive on OS X

I am trying to write a shell script to unmount/mount all external drive on OS X.

My disk list is as follows:

$ diskutil list
/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *500.3 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage                         499.4 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                  Apple_HFS Macintosh HD           *496.3 GB   disk1
                                 Logical Volume on disk0s2
                                 AE949253-803C-49DC-93EA-7DFC74C2EAA2
                                 Unencrypted
/dev/disk2
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *1.0 TB     disk2
   1:                        EFI EFI                     209.7 MB   disk2s1
   2:                  Apple_HFS Time Machine            999.9 GB   disk2s2
/dev/disk3
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *750.2 GB   disk3
   1:                        EFI EFI                     209.7 MB   disk3s1
   2:       Microsoft Basic Data USB HD 4                749.9 GB   disk3s2
/dev/disk4
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *500.1 GB   disk4
   1:                        EFI EFI                     209.7 MB   disk4s1
   2:       Microsoft Basic Data Backup                  499.9 GB   disk4s2
/dev/disk5
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *1.0 TB     disk5
   1:                        EFI EFI                     209.7 MB   disk5s1
   2:                  Apple_HFS USB HD 1                999.9 GB   disk5s2
/dev/disk6
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *4.0 TB     disk6
   1:                        EFI EFI                     209.7 MB   disk6s1
   2:                  Apple_HFS USB HD 2                4.0 TB     disk6s2
/dev/disk8
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     Apple_partition_scheme                        *122.9 GB   disk8
   1:        Apple_partition_map                         32.3 KB    disk8s1
   2:             Apple_Driver43                         28.7 KB    disk8s2
   3:             Apple_Driver43                         28.7 KB    disk8s3
   4:           Apple_Driver_ATA                         28.7 KB    disk8s4
   5:           Apple_Driver_ATA                         28.7 KB    disk8s5
   6:             Apple_FWDriver                         262.1 KB   disk8s6
   7:         Apple_Driver_IOKit                         262.1 KB   disk8s7
   8:              Apple_Patches                         262.1 KB   disk8s8
   9:                  Apple_HFS Windows                 122.9 GB   disk8s9

So, I write a script like:

#!/bin/sh

diskutil list | grep -oE 'disk[0-9]s2' | while read i
do
  Prtl=`diskutil info ${i} | grep Protocol | cut -d ' ' -f 21`
  if [ ${Prtl} = USB ]; then
    diskutil unmount ${i}
  fi
done

I'd like to know the followings:

1.Is there a way to identify external drive without using diskutil info? The reason is diskutil info starts up sleeping drive, my script is very slow.

2.Are there any much more smart way? I have Googled so much, but I can't find a way which I want. Hope to help me...

Upvotes: 1

Views: 3100

Answers (2)

2fuu
2fuu

Reputation: 71

Won't solve the hard-drive spinning up latency, but you could also write:

find /dev -name "disk[1-9]" -exec diskutil eject {} \;

Alternatively, this script has been working well for me:

osascript -e 'tell application "Finder" to eject (every disk whose ejectable is true)'

Upvotes: 7

sudo
sudo

Reputation: 5784

You could try using system_profiler with different data types. I don't think it wakes up the drives. system_profiler SPUSBDataType will give you all USB devices and their mount points, and system_profiler SPFireWireDataType does the same for FireWire devices. system_profiler -listDataTypes will give you all data types. Once you parse out the mount points, you can unmount those drives.

It's not perfectly portable across different systems to just do USB then FireWire then Thunderbolt because there could be different connections. To try everything, you could do system_profiler (which lists all data) then search for anything following "Mount Point:" and unmount whatever is after that.

This is an example of the data it prints out for a USB drive:

1394A/USB2.0/eSATA combo drive:

          Product ID: 0x000a
          Vendor ID: 0x0928  (Oxford Semiconductor Ltd.)
          Version: 0.00
          Serial Number: 2009100700000936
          Speed: Up to 480 Mb/sec
          Manufacturer: PI-208
          Location ID: 0xfd500000 / 3
          Current Available (mA): 500
          Current Required (mA): 0
          Capacity: 1 TB (1,000,204,886,016 bytes)
          Removable Media: Yes
          Detachable Drive: Yes
          BSD Name: disk5
          Partition Map Type: GPT (GUID Partition Table)
          S.M.A.R.T. status: Not Supported
          Volumes:
            disk5s1:
              Capacity: 209.7 MB (209,715,200 bytes)
              BSD Name: disk5s1
              Content: EFI
            Clone:
              Capacity: 650.2 GB (650,200,002,560 bytes)
              Available: 101.49 GB (101,489,717,248 bytes)
              Writable: Yes
              File System: Journaled HFS+
              BSD Name: disk5s2
              Mount Point: /Volumes/Clone
              Content: Apple_HFS
              Volume UUID: F42D6E05-C72C-386A-86AD-635A818E1FE3
            LocalBackup:
              Capacity: 339.53 GB (339,526,688,768 bytes)
              Available: 53.88 GB (53,881,970,688 bytes)
              Writable: Yes
              File System: Journaled HFS+
              BSD Name: disk5s3
              Mount Point: /Volumes/LocalBackup
              Content: Apple_HFS
              Volume UUID: 04974080-CB76-3CC3-BC37-274241D1BC0F
            Yosemite:
              Capacity: 9.35 GB (9,350,000,640 bytes)
              Available: 9.31 GB (9,311,920,128 bytes)
              Writable: Yes
              File System: Journaled HFS+
              BSD Name: disk5s4
              Mount Point: /Volumes/Yosemite
              Content: Apple_HFS
              Volume UUID: AE809679-3C2A-3BE4-950F-551663791CE3

Upvotes: 1

Related Questions