Skip to the content.



jc - JSON Convert rsync command output streaming parser

This streaming parser outputs JSON Lines (cli) or returns an Iterable of Dictionaries (module)

Supports the -i or --itemize-changes options with all levels of verbosity. This parser will process the STDOUT output or a log file generated with the --log-file option.

Usage (cli):

$ rsync -i -a source/ dest | jc --rsync-s


$ cat rsync-backup.log | jc --rsync-s

Usage (module):

import jc

result = jc.parse('rsync_s', rsync_command_output.splitlines())
for item in result:
    # do something


  "type":                           string,       # 'file' or 'summary'
  "date":                           string,
  "time":                           string,
  "process":                        integer,
  "sent":                           integer,
  "received":                       integer,
  "total_size":                     integer,
  "matches":                        integer,
  "hash_hits":                      integer,
  "false_alarms":                   integer,
  "data":                           integer,
  "bytes_sec":                      float,
  "speedup":                        float,
  "filename":                       string,
  "date":                           string,
  "time":                           string,
  "process":                        integer,
  "metadata":                       string,
  "update_type":                    string/null,  # [0]
  "file_type":                      string/null,  # [1]
  "checksum_or_value_different":    bool/null,
  "size_different":                 bool/null,
  "modification_time_different":    bool/null,
  "permissions_different":          bool/null,
  "owner_different":                bool/null,
  "group_different":                bool/null,
  "acl_different":                  bool/null,
  "extended_attribute_different":   bool/null,
  "epoch":                          integer,      # [2]

  # below object only exists if using -qq or ignore_exceptions=True
  "_jc_meta": {
    "success":      boolean,     # false if error parsing
    "error":        string,      # exists if "success" is false
    "line":         string       # exists if "success" is false

[0] 'file sent', 'file received', 'local change or creation',
    'hard link', 'not updated', 'message'
[1] 'file', 'directory', 'symlink', 'device', 'special file'
[2] naive timestamp if time and date fields exist and can be converted.


$ rsync -i -a source/ dest | jc --rsync-s

$ cat rsync_backup.log | jc --rsync-s


def parse(data: Iterable[str],
          raw: bool = False,
          quiet: bool = False,
          ignore_exceptions: bool = False) -> Union[Iterable[Dict], tuple]

Main text parsing generator function. Returns an iterable object.


data:              (iterable)  line-based text data to parse
                               (e.g. sys.stdin or str.splitlines())

raw:               (boolean)   unprocessed output if True
quiet:             (boolean)   suppress warning messages if True
ignore_exceptions: (boolean)   ignore parsing exceptions if True


Iterable of Dictionaries

Parser Information

Compatibility: linux, darwin, freebsd

Version 1.2 by Kelly Brazil (