Как удалить (tmutil delete) все старые резервные копии из TimeMachine — оставить только текущую полную резервную копию

Как удалить (с помощью CLI tmutil delete) все старые резервные копии из TimeMachine. Я хочу сохранить только текущую резервную копию.

Я хочу поместить это в crontab.

Найдено , как удалить старые резервные копии из Time Machine на Mac

sudo tmutil delete /Volumes/Time Machine Backups/Backups.backupdb/MacBook\ Pro/2015-07-13-150021/

Я не люблю указывать временные метки. Я хочу иметь только одну текущую полную резервную копию. Это означает удаление удаленных файлов и версий с резервного диска.

Если вы хотите делать это часто, я думаю, вы используете неправильный инструмент, попробуйте Carbon Copy Cloner или Superduper, которые предназначены только для одной копии.
Но и то, и другое стоит меньше (и не слишком много), чем проблемы с плохой резервной копией или время, которое вы потратили на это — но бесплатно посмотрите на rsync
Да, я согласен: возня с ТМ обычно приводит к тому, что все идет не так. Если вам нужна только одна копия, используйте другой инструмент. Кроме того: одна копия на самом деле не является резервной. Как восстановить удаленный файл, если ваша резервная копия — это только одна копия того, что у вас есть сейчас?

Ответы (2)

Начиная с macOS Big Sur 11.2.3+ и в соответствии с обновленной версией man tmutilвам необходимо указать диск точки монтирования и отметку времени каждой резервной копии, используя флаги и соответственно -d. -tИтак, для принятого ответа необходима следующая настройка:

# assuming you have the backup disk connected & root privileges:
# get the latest backup to exclude from deletion
latest=$(sudo tmutil latestbackup)
# the 4th line after the last space from `tmutil destinationinfo` output
# contains the mount disk name
mountpoint=$(tmutil destinationinfo | sed '4q;d' | sed 's/.* //')
echo "latest is $latest"
# delete all the backups excluding the latest
backups=$(sudo tmutil listbackups)
echo $backups | while read timestamp; do
    if [[ "$timestamp" != "$(basename $latest)" ]]; then
        echo sudo tmutil delete -d $mountpoint -t $timestamp
    fi
done

# if you want to keep the last, say, 3 backups, pipe "sed '$d'" 3-1=2 times:
backups=$(sudo tmutil listbackups | sed '$d' | sed '$d')

Это должно выглядеть так sudo tmutil delete -d /Volumes/TimeMachineBackups -t 2021-04-10-004103.

MacOS Big Sur 11.2.3 здесь. Для этой команды: sudo tmutil delete -d 2020-12-16 -t 151046.backupя получаю эту ошибку:151046.backup: Invalid argument (error 22)
@bartektartanus с чем ты связан tmutil listbackups?. Для меня это ГГГГ-ММ-ДД-ччммсс. В этом случае вы можете удалить .backupсуффикс. Я добавил правку.
Это не сработает. man tmutilговорит: удалить [-d резервная_точка_монтирования -t временная метка] [-p путь]. Путь указан только для hfs, но вам нужна точка монтирования, а также метка времени. Нет аргумента -d.
@Gilby, спасибо, что указали на это. Я только что исправил это.
Нет. Когда я пытался, это должно было быть sudo tmutil delete -d /Volumes/.timemachine/<UUID>/<date-time>.backup -t <date-time>. Смотрите мой ответ на apple.stackexchange.com/questions/407967/…
#!/bin/bash
latest=$(sudo tmutil latestbackup)
sudo tmutil listbackups | while read backup; do
    if [[ "$backup" != "$latest" ]]; then
        echo sudo tmutil delete "$backup"
    fi
done

Удалите, как echoтолько убедитесь, что вывод правильный.

В зависимости от размера этих резервных копий льготный период sudoможет истечь во время выполнения tmutil delete. Вероятно, вы захотите просто удалить sudo из скрипта и вместо этого запустить этот скрипт с помощью sudo. Кроме того, tmutil listbackupsна самом деле не перечислены «последние» резервные копии, по крайней мере, не в моей системе, поэтому ваш скрипт эффективно удаляет ВСЕ резервные копии.
@DanielSmedegaardBuus Верное замечание о sudo, но я не понимаю второе замечание. Цель состоит в том, чтобы удалить все, кроме последней резервной копии (которую возвращает sudo tmutil latestbackup).
Плохо, я пропустил эту часть в сценарии XD Я сделал это вручную.