How to eject all drives from the command-line

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"

        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.


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

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.


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