3

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

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.

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
  • Nice one, with the benefit of one-line at the cost of a sudo. +1 for ejecting drives that are still busy. – miguelmorin Sep 19 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.... – miguelmorin Sep 30 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 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. – miguelmorin Oct 3 at 9:38
0

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.

  • Yes, I'd been using diskutil, with the disadvantage of ejecting drives one by one and remembering their names. – miguelmorin Sep 19 at 19:24

You must log in to answer this question.

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