2026-03-15 09:34:31 -04:00
. \" Man page generated from reStructuredText
. \" by the Docutils 0.22.4 manpage writer.
2017-02-05 08:22:06 -05:00
.
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\ $1 \\ n[an-margin]
level \\ n[rst2man-indent-level]
level margin: \\ n[rst2man-indent\\ n[rst2man-indent-level]]
-
\\ n[rst2man-indent0]
\\ n[rst2man-indent1]
\\ n[rst2man-indent2]
. .
.de1 INDENT
. \" .rstReportMargin pre:
. RS \\ $1
. nr rst2man-indent\\n[rst2man-indent-level] \\ n[an-margin]
. nr rst2man-indent-level +1
. \" .rstReportMargin post:
. .
.de UNINDENT
. RE
. \" indent \\n[an-margin]
. \" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
. \" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\ n[rst2man-indent\\n[rst2man-indent-level]]u
. .
2026-03-15 09:34:31 -04:00
.TH "borg-diff" "1" "2026-03-15" "" "borg backup tool"
.SH Name
2025-12-23 12:00:09 -05:00
borg-diff \- Finds differences between two archives.
2017-02-05 08:22:06 -05:00
.SH SYNOPSIS
.sp
2022-06-23 19:19:19 -04:00
borg [common options] diff [options] ARCHIVE1 ARCHIVE2 [PATH...]
2017-02-05 08:22:06 -05:00
.SH DESCRIPTION
.sp
2023-06-11 17:10:23 -04:00
This command finds differences (file contents, metadata) between ARCHIVE1 and ARCHIVE2.
2017-02-05 08:22:06 -05:00
.sp
2025-12-23 12:00:09 -05:00
For more help on include/exclude patterns, see the output of the \fI borg_patterns\fP command.
2017-02-05 08:22:06 -05:00
.SH OPTIONS
.sp
See \fI borg\- common(1)\fP for common options of Borg commands.
.SS arguments
.INDENT 0 .0
.TP
2022-06-23 19:19:19 -04:00
.B ARCHIVE1
ARCHIVE1 name
2017-02-05 08:22:06 -05:00
.TP
.B ARCHIVE2
2022-06-23 19:19:19 -04:00
ARCHIVE2 name
2017-02-05 08:22:06 -05:00
.TP
.B PATH
2025-12-23 12:00:09 -05:00
paths of items inside the archives to compare; patterns are supported.
2017-02-05 08:22:06 -05:00
.UNINDENT
2025-04-21 15:07:46 -04:00
.SS options
2017-02-05 08:22:06 -05:00
.INDENT 0 .0
.TP
2022-06-23 19:19:19 -04:00
.B \- \- numeric\-ids
2017-02-05 08:22:06 -05:00
only consider numeric user and group identifiers
.TP
2022-06-23 19:19:19 -04:00
.B \- \- same\-chunker\-params
2025-12-23 12:00:09 -05:00
override the check of chunker parameters
2021-05-11 16:33:28 -04:00
.TP
2023-06-11 17:10:23 -04:00
.BI \- \- format \ FORMAT
specify format for differences between archives (default: \(dq {change} {path}{NL}\(dq )
.TP
2022-06-23 19:19:19 -04:00
.B \- \- json\-lines
2021-05-11 16:33:28 -04:00
Format output as JSON Lines.
2023-06-11 17:10:23 -04:00
.TP
2025-12-23 12:00:09 -05:00
.B \- \- sort\-by
Sort output by comma\- separated fields (e.g., \(aq >size_added,path\(aq ).
.TP
2023-06-11 17:10:23 -04:00
.B \- \- content\-only
Only compare differences in content (exclude metadata differences)
2017-02-05 08:22:06 -05:00
.UNINDENT
2023-06-11 17:10:23 -04:00
.SS Include/Exclude options
2017-03-26 19:58:19 -04:00
.INDENT 0 .0
.TP
2020-10-04 14:33:08 -04:00
.BI \- e \ PATTERN\fR,\fB \ \- \- exclude \ PATTERN
2017-03-26 19:58:19 -04:00
exclude paths matching PATTERN
.TP
.BI \- \- exclude\-from \ EXCLUDEFILE
read exclude patterns from EXCLUDEFILE, one per line
.TP
.BI \- \- pattern \ PATTERN
2022-02-05 11:30:40 -05:00
include/exclude paths matching PATTERN
2017-03-26 19:58:19 -04:00
.TP
.BI \- \- patterns\-from \ PATTERNFILE
2022-02-05 11:30:40 -05:00
read include/exclude patterns from PATTERNFILE, one per line
2017-03-26 19:58:19 -04:00
.UNINDENT
2017-02-05 08:22:06 -05:00
.SH EXAMPLES
.INDENT 0 .0
.INDENT 3 .5
.sp
2025-04-21 15:07:46 -04:00
.EX
2022-06-23 19:19:19 -04:00
$ borg diff archive1 archive2
2021-05-11 16:33:28 -04:00
+17 B \- 5 B [\- rw\- r\- \- r\- \- \- > \- rwxr\- xr\- x] file1
2017-02-05 08:22:06 -05:00
+135 B \- 252 B file2
added 0 B file4
removed 0 B file3
2021-05-11 16:33:28 -04:00
2022-06-23 19:19:19 -04:00
$ borg diff archive1 archive2
2022-09-10 10:03:27 -04:00
{\(dq path\(dq : \(dq file1\(dq , \(dq changes\(dq : [{\(dq type\(dq : \(dq modified\(dq , \(dq added\(dq : 17, \(dq removed\(dq : 5}, {\(dq type\(dq : \(dq mode\(dq , \(dq old_mode\(dq : \(dq \- rw\- r\- \- r\- \- \(dq , \(dq new_mode\(dq : \(dq \- rwxr\- xr\- x\(dq }]}
{\(dq path\(dq : \(dq file2\(dq , \(dq changes\(dq : [{\(dq type\(dq : \(dq modified\(dq , \(dq added\(dq : 135, \(dq removed\(dq : 252}]}
{\(dq path\(dq : \(dq file4\(dq , \(dq changes\(dq : [{\(dq type\(dq : \(dq added\(dq , \(dq size\(dq : 0}]}
{\(dq path\(dq : \(dq file3\(dq , \(dq changes\(dq : [{\(dq type\(dq : \(dq removed\(dq , \(dq size\(dq : 0}]}
2025-12-23 12:00:09 -05:00
# Use \- \- sort\- by with a comma\- separated list; sorts apply stably from last to first.
# Here: primary by net size change descending, tie\- breaker by path ascending
$ borg diff \- \- sort\- by=\(dq >size_diff,path\(dq archive1 archive2
+17 B \- 5 B [\- rw\- r\- \- r\- \- \- > \- rwxr\- xr\- x] file1
removed 0 B file3
added 0 B file4
+135 B \- 252 B file2
2025-04-21 15:07:46 -04:00
.EE
2017-02-05 08:22:06 -05:00
.UNINDENT
.UNINDENT
2023-06-11 17:10:23 -04:00
.SH NOTES
.SS The FORMAT specifier syntax
.sp
2026-03-15 09:34:31 -04:00
The \fB \- \- format\fP option uses Python\(aq s format string syntax \% <https://\: docs\: .python\: .org/\: 3\: .10/\: library/\: string\: .html#\: formatstrings>\& .
2023-06-11 17:10:23 -04:00
.sp
Examples:
.INDENT 0 .0
.INDENT 3 .5
.sp
2025-04-21 15:07:46 -04:00
.EX
2023-06-11 17:10:23 -04:00
$ borg diff \- \- format \(aq {content:30} {path}{NL}\(aq ArchiveFoo ArchiveBar
modified: +4.1 kB \- 1.0 kB file\- diff
\& ...
# {VAR:<NUMBER} \- pad to NUMBER columns left\- aligned.
# {VAR:>NUMBER} \- pad to NUMBER columns right\- aligned.
$ borg diff \- \- format \(aq {content:>30} {path}{NL}\(aq ArchiveFoo ArchiveBar
modified: +4.1 kB \- 1.0 kB file\- diff
\& ...
2025-04-21 15:07:46 -04:00
.EE
2023-06-11 17:10:23 -04:00
.UNINDENT
.UNINDENT
.sp
The following keys are always available:
2026-03-15 09:34:31 -04:00
\- NEWLINE: OS dependent line separator
\- NL: alias of NEWLINE
\- NUL: NUL character for creating print0 / xargs \- 0 like output
\- SPACE: space character
\- TAB: tab character
\- CR: carriage return character
\- LF: line feed character
2023-06-11 17:10:23 -04:00
.sp
Keys available only when showing differences between archives:
.INDENT 0 .0
.IP \(bu 2
path: archived file path
.IP \(bu 2
change: all available changes
.IP \(bu 2
content: file content change
.IP \(bu 2
mode: file mode change
.IP \(bu 2
type: file type change
.IP \(bu 2
owner: file owner (user/group) change
.IP \(bu 2
group: file group change
.IP \(bu 2
user: file user change
.IP \(bu 2
link: file link change
.IP \(bu 2
directory: file directory change
.IP \(bu 2
blkdev: file block device change
.IP \(bu 2
chrdev: file character device change
.IP \(bu 2
fifo: file fifo change
.IP \(bu 2
mtime: file modification time change
.IP \(bu 2
ctime: file change time change
.IP \(bu 2
isomtime: file modification time change (ISO 8601)
.IP \(bu 2
isoctime: file creation time change (ISO 8601)
.UNINDENT
2025-12-23 12:00:09 -05:00
.SS What is compared
.sp
For each matching item in both archives, Borg reports:
.INDENT 0 .0
.IP \(bu 2
Content changes: total added/removed bytes within files. If chunker parameters are comparable,
Borg compares chunk IDs quickly; otherwise, it compares the content.
.IP \(bu 2
Metadata changes: user, group, mode, and other metadata shown inline, like
\(dq [old_mode \- > new_mode]\(dq for mode changes. Use \fB \- \- content\- only\fP to suppress metadata changes.
.IP \(bu 2
Added/removed items: printed as \(dq added SIZE path\(dq or \(dq removed SIZE path\(dq .
.UNINDENT
.SS Output formats
.sp
The default (text) output shows one line per changed path, e.g.:
.INDENT 0 .0
.INDENT 3 .5
.sp
.EX
+135 B \- 252 B [ \- rw\- r\- \- r\- \- \- > \- rwxr\- xr\- x ] path/to/file
.EE
.UNINDENT
.UNINDENT
.sp
JSON Lines output (\fB \- \- json\- lines\fP ) prints one JSON object per changed path, e.g.:
.INDENT 0 .0
.INDENT 3 .5
.sp
.EX
{\(dq path\(dq : \(dq PATH\(dq , \(dq changes\(dq : [
{\(dq type\(dq : \(dq modified\(dq , \(dq added\(dq : BYTES, \(dq removed\(dq : BYTES},
{\(dq type\(dq : \(dq mode\(dq , \(dq old_mode\(dq : \(dq \- rw\- r\- \- r\- \- \(dq , \(dq new_mode\(dq : \(dq \- rwxr\- xr\- x\(dq },
{\(dq type\(dq : \(dq added\(dq , \(dq size\(dq : SIZE},
{\(dq type\(dq : \(dq removed\(dq , \(dq size\(dq : SIZE}
]}
.EE
.UNINDENT
.UNINDENT
.SS Sorting
.sp
Use \fB \- \- sort\- by FIELDS\fP where FIELDS is a comma\- separated list of fields.
Sorts are applied stably from last to first in the given list. Prepend \(dq >\(dq for
descending, \(dq <\(dq (or no prefix) for ascending, for example \fB \- \- sort\- by=\(dq >size_added,path\(dq \fP \& .
Supported fields include:
.INDENT 0 .0
.IP \(bu 2
path: the item path
.IP \(bu 2
size_added: total bytes added for the item content
.IP \(bu 2
size_removed: total bytes removed for the item content
.IP \(bu 2
size_diff: size_added \- size_removed (net content change)
.IP \(bu 2
size: size of the item as stored in ARCHIVE2 (0 for removed items)
.IP \(bu 2
user, group, uid, gid, ctime, mtime: taken from the item state in ARCHIVE2 when present
.IP \(bu 2
ctime_diff, mtime_diff: timestamp difference (ARCHIVE2 \- ARCHIVE1)
.UNINDENT
.SS Performance considerations
.sp
diff automatically detects whether the archives were created with the same chunker
parameters. If so, only chunk IDs are compared, which is very fast.
2017-02-05 08:22:06 -05:00
.SH SEE ALSO
.sp
\fI borg\- common(1)\fP
2026-03-15 09:34:31 -04:00
.SH Author
2017-02-05 08:22:06 -05:00
The Borg Collective
2026-03-15 09:34:31 -04:00
. \" End of generated man page.