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