10

I want to eject all hard drives with a command on the Terminal instead of going to the Finder and pressing eject on each drive. How can I do it?

4 Answers 4

13

You can use the in-built AppleScript solution, as mentioned in this thread and this page, by adding this to ~/.bash_profile:

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

This will require you giving permission to Terminal to control Finder, or you will get this error:

execution error: Not authorised to send Apple events to Finder. (-1743)

If you want a pure bash solution, here is a function that you can call with ejectall. If you renamed your startup disk or have different Time Machine backups, you may need to edit the condition that filters out the drives.

ejectall() {
    total=0
    ejected=0
    
    for v in /Volumes/*; do
    if [[ $v != *"Macintosh HD" && $v != *"com.apple.TimeMachine"* ]]; then
        echo "Ejecting $v..."
        diskutil eject "$v" # The command to eject the volume
        
        if [ $? -eq 0 ]; then
        ejected=$(($ejected + 1))
        fi
        total=$(($total + 1))
    fi
    done
    
    if [ $total -eq 0 ]; then
    echo "No drives to eject"
    else
    msg="$ejected drive(s) ejected"
    failed=$(($total - $ejected))
    if [ $failed -gt 0 ]; then
        msg="$msg, $failed drive(s) failed to eject"
    fi
    echo $msg
    fi
}

Both methods will also work for CDs.

6

I've recently started learning shell scripting so I tried an answer to this as an exercise.

Script uses diskutil list external to get all external disks then loops over the output to unmount them.

I then created an alias in ~/.zshrc so I now only have to type eject in Terminal to eject all external disks attached to my Mac.

(thanks to @nohillside for the tweaks)

#!/bin/sh

#script to eject all external drives
disks=$(diskutil list external | sed -n '/[Ss]cheme/s/.*B *//p')

if [ "$disks" ]
then
echo "$disks" | while read line ; do
    diskutil unmountDisk /dev/$line
  done
else
  echo "No external disks to eject"
fi
0
4

Use diskutil.

You can list the current devices with diskutil list, and use diskutil eject device-name to eject a device just like from Finder.

This will go a step further than just using umount by, for example, disconnect a USB device so it /dev/disk node disappears.

See man diskutil for more details.

2
  • Yes, I'd been using diskutil, with the disadvantage of ejecting drives one by one and remembering their names. Sep 19, 2019 at 19:24
  • It will spin down the drive too
    – samus
    Dec 15, 2021 at 16:43
2

umount has an option to unmount all file systems besides the main one.

sudo umount -A

You can also force this in case files are still busy/locked (with the risk of data loss) by running

sudo umount -A -f
4
  • Nice one, with the benefit of one-line at the cost of a sudo. +1 for ejecting drives that are still busy. Sep 19, 2019 at 19:24
  • I tried this command twice and on both occasions it caused my macOS computer to hang, with the last line in the terminal saying Saving session.... Sep 30, 2019 at 9:49
  • @miguelmorin That's a message from Terminal when you terminate the shell running within a tab. I don't see how it relates to unmounting all the drives besides the main drive unless your home folder (or any other file referenced by the shell) is stored on one of the unmounted drives.
    – nohillside
    Sep 30, 2019 at 9:57
  • I don't have the home folder in the unmounted drives. I don't think I have files referenced by the shell there either because they serve for Time Machine backups or a data drive for videos, and I can launch Terminal when they are not connected. Oct 3, 2019 at 9:38

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .