Skip to content

Instantly share code, notes, and snippets.

@blanboom
Forked from linjer/tmcleanup.md
Last active December 3, 2023 07:19
Show Gist options
  • Star 15 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save blanboom/014654c2e1b858359fada810ca5215d4 to your computer and use it in GitHub Desktop.
Save blanboom/014654c2e1b858359fada810ca5215d4 to your computer and use it in GitHub Desktop.
Script to automatically remote old Mac OSX Time Machine Backups older than a specified number of days

Prerequisites

  • gfind (via brew install findutils)
  • Time Machine drive mounted on your computer (or you can change path from standard /Volume/Time\ Machine\ Backups/Backups.backup.db/
  • Admin/sudo access in the OSX terminal

Script

  • Be sure to set the correct machine name. You can check the actual folder things are going into by looking in the backup location.
  • By default, it erases all backups older than 30 days. Adjust as desired.

Example

Clean all backups older than 30 days:

sudo ./tmcleanup.sh /Volumes/Time\ Machine\ Backups/Backups.backupdb my_computer_name 30

Clean 50% of backups older than 30 days:

sudo ./tmcleanup_50percent.sh /Volumes/Time\ Machine\ Backups/Backups.backupdb my_computer_name 30
#!/bin/bash
#
# Pre-requesite is that GNU linux findutils package is installed (brew install findutils) for gfind
# Should be possible to just use find but I have not tested it (should just omit -daystart)
#
# USEAGE:
# ./tmcleanup.sh BACKUP_LOCATION MACHINE_NAME DAY_AGE
#
# EXAMPLE:
# ./tmcleanup.sh /Volumes/Time\ Machine\ Backups/Backups.backupdb my_computer_name 30
#
if [ "$#" -ne 3 ] ; then
echo "USEAGE:"
echo " $0 BACKUP_LOCATION MACHINE_NAME DAY_AGE"
echo "EXAMPLE:"
echo " $0 /Volumes/Time\ Machine\ Backups/Backups.backupdb my_computer_name 30"
exit
fi
BACKUP_LOCATION=$1
MACHINE_NAME=$2
DAY_AGE=$3
if [ ! -d "${BACKUP_LOCATION}" ]; then
echo "${BACKUP_LOCATION} is currently not accessible. Please connect your Time Machine disk or change the path."
exit
fi
echo "*-* Removing old Time Machine Backups for ${MACHINE_NAME} older than ${DAY_AGE} days *-*"
# Get a list of all the
result=$(gfind "${BACKUP_LOCATION}"/"${MACHINE_NAME}"/ -daystart -maxdepth 1 -mindepth 1 -mmin +$((60*24*${DAY_AGE})))
echo "$result"
if [ -n "$result" ]; then
while read -r line; do
START_TIME=$(date +%s)
tmutil delete "$line"
END_TIME=$(date +%s)
echo "Elapsed time: $(($END_TIME - $START_TIME)) secs."
done <<< "$result"
echo "Run hdiutil compact /path/to/timemachine/sparsebundle if necessary"
echo "Finished!"
else
echo "Did not find any Time Machine Backups older than ${DAY_AGE} days old."
fi
#!/bin/bash
#
# Pre-requesite is that GNU linux findutils package is installed (brew install findutils) for gfind
# Should be possible to just use find but I have not tested it (should just omit -daystart)
#
# USEAGE:
# ./tmcleanup_50percent.sh BACKUP_LOCATION MACHINE_NAME DAY_AGE
#
# EXAMPLE:
# ./tmcleanup_50percent.sh /Volumes/Time\ Machine\ Backups/Backups.backupdb my_computer_name 30
#
if [ "$#" -ne 3 ] ; then
echo "USEAGE:"
echo " $0 BACKUP_LOCATION MACHINE_NAME DAY_AGE"
echo "EXAMPLE:"
echo " $0 /Volumes/Time\ Machine\ Backups/Backups.backupdb my_computer_name 30"
exit
fi
BACKUP_LOCATION=$1
MACHINE_NAME=$2
DAY_AGE=$3
if [ ! -d "${BACKUP_LOCATION}" ]; then
echo "${BACKUP_LOCATION} is currently not accessible. Please connect your Time Machine disk or change the path."
exit
fi
echo "*-* Removing old Time Machine Backups for ${MACHINE_NAME} older than ${DAY_AGE} days *-*"
# Get a list of all the
result=$(gfind "${BACKUP_LOCATION}"/"${MACHINE_NAME}"/ -daystart -maxdepth 1 -mindepth 1 -mmin +$((60*24*${DAY_AGE})))
echo "$result"
if [ -n "$result" ]; then
while read -r line1 && read -r line2; do
START_TIME=$(date +%s)
tmutil delete "$line1"
END_TIME=$(date +%s)
echo "Elapsed time: $(($END_TIME - $START_TIME)) secs."
done <<< "$result"
echo "Run hdiutil compact /path/to/timemachine/sparsebundle if necessary"
echo "Finished!"
else
echo "Did not find any Time Machine Backups older than ${DAY_AGE} days old."
fi
@chinghai0731
Copy link

第 40 行的 tmutil delete "$line",應該忘了加參數?
tmutil delete -p "$line"

好像在 Big Sur 上,命令格式有变化:https://www.reddit.com/r/MacOS/comments/kerdvg/big_sur_tmutil_delete_no_longer_works/

嗯,現在的版本是要加參數了~... -p 我是 11.5

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment