Time Machine automatically deletes old backups when it’s getting full, but if you also use the backup disk for other purposes, you might want to clear some space manually.
There is a built-in command line utility that comes with macOS which you can use for this – tmutil
.
Specifically, the sub-command you want is tmutil delete
, here is an extract from the man page:
delete [-d backup_mount_point -t timestamp] [-p path] Deletes the backups with the specified timestamp from the backup volume mounted at the specified mountpoint. The -t option followed by a timestamp can be used multiple times to specify multiple backups to delete. For HFS backup disks, a specific path to delete can also be specified using the -p option. This verb can delete items from backups that were not made by, or are not claimed by, the current machine. Requires root and Full Disk Access privileges.
You can list existing backups with tmutil listbackups
but the path that’s printed is not the path you need to provide to tmutil delete
. In fact, you actually need to provide the -d
and -t
flags, not -p
.
To find the backup mount point, you can use tmutil destinationinfo
. Here is an example output:
~ $ tmutil destinationinfo ==================================================== Name : Time Machine Kind : Local Mount Point : /Volumes/Time Machine ID : F0CBBC01-DEAD-CA1F-BEEF-0000AAAABBBB
So in this case, the value for the -d
flag is "/Volumes/Time Machine"
.
You can extract this with awk
or another utility, for example:
~ $ tmutil destinationinfo | awk -F ' : ' '/Mount Point/{print $2}' /Volumes/Time Machine
As for the -t
(timestamp) flag, this is obvious from the tmutil listbackups
output, but you can even specify -t
in the listbackups
sub-command which prints only the value needed in the correct format.
For example:
~ $ tmutil listbackups -t 2022-02-05-094839 2022-02-12-091416 2022-02-19-093000 2022-02-26-092448 ...
Bringing it all together
Now we know what values to pass to tmutil delete
, the final command might look like this:
sudo tmutil delete -d "/Volumes/Time Machine" -t 2022-02-05-094839
But we can go one better than this… Say you want to delete all the backups from Jan-Mar in 2023, you can use this one-liner:
tmutil listbackups -t | \
egrep '2023-0[123]' | \
xargs -L 1 sudo tmutil delete \
-d "$(tmutil destinationinfo | awk -F ' : ' '/Mount Point/{print $2}')" -t
Of course you could filter in other ways, e.g. head -n 20
to delete the oldest 20 backups (careful though, this will delete the most recent as well if there are only 20 or fewer in total).