39

The Time Machine control panel gives information on in-progress backups. For example

enter image description here

Is there a way to get the information from the command line?

5 Answers 5

60

While the backup is running, detailed information gan be gained by

tmutil status

which should return something like this:

Backup session status:
{
    BackupPhase = Copying;
    ClientID = "com.apple.backupd";
    DateOfStateChange = "2014-12-18 14:14:21 +0000";
    DestinationID = "B4AF88-5AD5-49BE-B254-650B44E20499";
    DestinationMountPoint = "/Volumes/TimeMachine";
    Percent = "0.852581430477103";
    Progress =     {
        TimeRemaining = 0;
        "_raw_totalBytes" = 38596759;
        bytes = 36563200;
        files = 480;
        totalBytes = 42456434;
        totalFiles = 480;
    };
    Running = 1;
    Stopping = 0;
    "_raw_Percent" = "0.9473127005301144";
}

If you only care for the percentage, try the following (looks ugly, works only if there is a percentage to display):

tmutil status | awk '/_raw_Percent/ {print $3}' | grep -o '[0-9].[0-9]\+\(e-[0-9]\+\)\?' | awk '{print $1*100}'
7
  • 2
    I couldn't find this in the manpage. Where did you glean this verb for tmutil?
    – jsejcksn
    Dec 8, 2016 at 2:38
  • 4
    @jsejcksn To be honest, I don't remember where I found out about status, running tmutil help status now returns *** status is a private verb. ***; why this is the case and especially if this was the case two years ago, I don't know :D
    – Asmus
    Dec 9, 2016 at 9:42
  • 3
    What is the format of the data from tmutil? It's not quite JSON. Is it some kind of C object dump? Jan 27, 2018 at 16:44
  • 7
    @LS this is formatted as a NeXTSTEP-style property list
    – Asmus
    Feb 5, 2018 at 9:07
  • JSON files are somewhat brittle. Using a tool like jq which understands JSON to extract information might be a better approach. Oct 28, 2020 at 11:59
7

To get only the percentage value:

tmutil status | LC_NUMERIC="C" awk -F'"' '/_raw_Percent/ {print $4 * 100}'
1

I managed to make a simple script from the accepted answer.

tmstatus () {
  eval $(tmutil status | grep -E '[^}];$' | perl -p -e 's/^\s+[\"]*//g;' -e 's/[\"]*\s+\=\s+/=/g') || (echo "Something get wrong..." && return 1)

  if [[ $Running -eq 1 ]]
  then
    export LC_NUMERIC="en_US.UTF-8"
    [[ $BackupPhase == "Copying" ]] && Percent=$(printf '%0.2f%%' `bc <<< $Percent*100`) && echo "${DateOfStateChange} ${BackupPhase} backup to ${DestinationMountPoint}: ${totalFiles} files - ${Percent} (~$((${TimeRemaining:-0}/60)) min." || echo "${DateOfStateChange} ${BackupPhase} (Destination ${DestinationID})."
  else
    echo "TimeMachine backup is not running."
  fi
}
0

I used @Atika's very helpful script but sometimes got errors like bash: 26520.80484282512/60: syntax error: invalid arithmetic operator (error token is ".80484282512/60") so I made a slight tweak to pass that division operation to bc and now it works reliably (caveat: for me!):

BEFORE: (~$((${TimeRemaining:-0}/60)) min."

AFTER: (~$(bc <<< ${TimeRemaining:-0}/60) min.)

Updated Script:

tmstatus () {
  eval $(tmutil status | grep -E '[^}];$' | perl -p -e 's/^\s+[\"]*//g;' -e 's/[\"]*\s+\=\s+/=/g') || (echo "Something get wrong..." && return 1)

if [[ $Running -eq 1 ]]
then
  export LC_NUMERIC="en_US.UTF-8"
  [[ $BackupPhase == "Copying" ]] && Percent=$(printf '%0.2f%%' $(bc <<< $Percent*100)) && echo "${DateOfStateChange} ${BackupPhase} backup to ${DestinationMountPoint}: ${totalFiles} files - ${Percent} (~$(bc <<< ${TimeRemaining:-0}/60) min.)" || echo "${DateOfStateChange} ${BackupPhase} (Destination ${DestinationID})."
else
  echo "TimeMachine backup is not running."
fi
}
0

Maybe a bit more complicated but also more practical for processing, the following command will write the progress status into a plist file and convert it into json:

tmutil status | grep -v 'Backup session status' > a.plist; plutil -convert json a.plist

Json can be parsed more easily to extract various information.

You must log in to answer this question.

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